Perbedaan antara "<perintah> & penolakan" dan "tidak ada <perintah> & penolakan"

41

Ini adalah pemahaman saya tentang penggunaan &, disowndan nohup:

  • <command>: menjalankan proses dalam bashinstance Terminal saat ini , di latar depan (yaitu proses terdaftar sebagai bashpekerjaan latar depan dan stdin, stdoutdan stderrmasih terikat ke terminal ); tidak kebal terhadap hangup ;
  • <command> &: menjalankan proses dalam bashinstance Terminal saat ini , di latar belakang (yaitu proses terdaftar sebagai bashpekerjaan latar belakang dan stdin, stdoutdan stderrmasih terikat ke terminal ); tidak kebal terhadap hangup ;
  • <command> & disown: menjalankan proses dalam bashinstance Terminal saat ini , di latar belakang , tetapi proses terlepas dari daftar bash'pekerjaan' (yaitu proses tidak terdaftar sebagai pekerjaan bashlatar depan / latar belakang dan stdin, stdoutdan stderrmasih terikat ke terminal ); kebal terhadap hangup ;
  • nohup <command> & disown: Menjalankan proses dalam Terminal saat ini bashmisalnya, di latar belakang , tetapi proses ini terlepas dari bashdaftar 's pekerjaan' (yaitu proses ini tidak terdaftar sebagai bashforeground / latar belakang pekerjaan dan stdin, stdoutdan stderryang tidak masih terikat ke terminal ) ; kebal terhadap hangup ;

Jadi, selain dari nohup <command> & disownmemblokir stdindan mengarahkan stdoutdan stderruntuk nohup.outsecara default, tampaknya bagi saya seperti itu dapat dianggap benar-benar setara dengan <command> & disown.

Apakah semua di atas benar? Adakah kesalahpahaman?

kos
sumber
1
Apa yang Anda maksud dengan "kebal terhadap hangup" dan "tidak kebal terhadap hangup"?
kekacauan
2
@chaos Maksud saya, menghentikan / membunuh bashinstance orang tua tidak akan mematikan proses
kos

Jawaban:

32

Pemahaman Anda pada dasarnya benar. Keduanya disowndan nohupdigunakan untuk memungkinkan Anda keluar dari sesi shell yang sedang berjalan tanpa menghentikan pekerjaan yang sedang berjalan. Beberapa klarifikasi:

  • Tidak ada alasan untuk lari nohup command & disown, nohupsudah akan menyangkal untuk Anda.

  • nohupadalah didefinisikan oleh POSIX sementara disown tidak . Ini berarti bahwa sementara banyak kerang (misalnya bash, zsh, ksh) memilikinya, yang lain (misalnya tcsh, csh, dashdan sh) akan tidak memilikinya.

  • disowndapat digunakan setelah perintah telah diluncurkan sementara nohupharus digunakan sebelumnya.

Sejauh yang saya tahu, efek sebenarnya dari kedua perintah itu sama. Mereka masing-masing memiliki fitur yang kurang dimiliki (lihat help disowndan man nohup) tetapi fungsi dasarnya sama, ya.

Untuk diskusi yang jauh lebih terperinci tentang alat-alat ini dan perbedaan di antara mereka, lihat jawabannya di sini:

terdon
sumber
11
Nohupdan disownbukan hal yang sama dan menggunakan kedua perintah bersama TIDAK berlebihan. Lihat jawaban ini untuk uraian mendalam
memo
7

Poin pertama hingga ketiga Anda tampaknya baik-baik saja, meskipun stdin, stdout and stderr are still bound to the terminalbukan gagasan yang benar. stdinselalu terikat ke terminal dalam arti bahwa Anda akan selalu memasukkan nama file ke perintah melalui terminal atau cara menggunakan terminal. stdout and stderr are still bound to the terminaltidak apa-apa.

Ada Anda stdin, stdout and stderr are not still bound to the terminalpada poin keempat yang tidak benar seperti yang disebutkan dalam paragraf saya sebelumnya. Juga di sini Anda menggunakan /dev/nullsebagai file input ke command, misalnya jika perintahnya adalah cat, Anda menggunakannya sebagai cat /dev/null.

Perintah pada poin ke-5 Anda tidak diletakkan dengan benar, Anda menggunakan nohup <command> & disown, saat menggunakan salah satu nohupatau disownyang lain tidak diperlukan. Tujuannya sama (untuk mengabaikan SIGHUP) tetapi fungsinya agak berbeda. Jadi perintah dapat disederhanakan sebagai nohup <command> &.

heemayl
sumber