Mengapa menjalankan perintah shell Linux dengan '&'?

30

Saya menggunakan Red Hat Linux Enterprise versi 5. Saya perhatikan orang terkadang menjalankan perintah dengan beberapa &opsi. Misalnya, dalam perintah di bawah ini, ada dua &tanda. Apa tujuan mereka? Apakah mereka selalu digunakan bersama dengan nohup?

nohup foo.sh <script parameters> >& <log_file_name> &
George2
sumber

Jawaban:

15

Selain jawaban Martin, Ash, dan Kevin, terkadang Anda akan melihat ampers dan digunakan secara matematis untuk bitwise AND * :

$ echo $(( 11 & 7 ))
3

Jika Anda tidak terbiasa dengan operator bit:

11: 1011
 7: 0111
-------- AND
 3: 0011

Di setiap posisi ada satu bit di angka pertama DAN angka kedua, atur bit itu menjadi satu di jawabannya.

* Fitur dalam jawaban Kevin disebut sebagai AND logis .

Untuk menguraikan jawaban Ash, saat digunakan dalam pengalihan, ampersand dapat memberitahu shell untuk menyalin deskriptor file. Dalam perintah ini echo "hello" > outputfile 2>&1, ampersand menyebabkan output apa pun yang mungkin menuju ke kesalahan standar (stderr, file descriptor 2) untuk pergi ke tempat yang sama dengan output standar (stdout, file descriptor 1, default untuk sisi kiri >). The >& outputfileOperator adalah istilah untuk > outputfile 2>&1.

Juga, baru dalam Bash 4, ada dua terminator baru untuk klausa dalam caseperintah ;&dan ;;&yang memengaruhi apakah suatu kasus "jatuh" dan, jika demikian, apakah pengujian berikutnya dilakukan.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
Keren, Dennis! Misalkan saya menggunakan ssh terminal log ke mesin, kemudian menggunakan terminal ssh untuk mengeksekusi perintah (misalkan proses jangka panjang), maka jika saya keluar dari sesi terminal, maka proses jangka panjang perintah akan diakhiri dengan benar? Dan jika saya ingin perintah terus dijalankan bahkan jika saya keluar dari shell, haruskah saya menggunakan nohup, atau & (di akhir perintah) atau menggunakan nohup dan &?
George2
1
@ George2: Tidak, >& filenamemengeluarkan stdout dan stderr ke file yang sama. Jika Anda ingin mengarahkan ulang stderr saja (dan biarkan stdout sendiri), Anda akan melakukannya 2> filename. Adapun pertanyaan Anda yang lain, kemungkinan besar Anda akan menggunakan keduanya nohupdan &.
Dijeda sampai pemberitahuan lebih lanjut.
1
@ George2: Jika Anda tidak menjalankan perintah maka Anda tidak akan mendapatkan prompt shell kembali sehingga Anda dapat mengeluarkan logoutatau exitperintah.
Dijeda sampai pemberitahuan lebih lanjut.
2
George: Jika Anda tidak menggunakan &, maka Anda tidak akan pernah mendapatkan konfirmasi kembali untuk melakukan hal lain. Terminal akan "digantung" sampai proses (apa pun itu) selesai atau diakhiri / dibunuh. The & menjamin bahwa proses berjalan di latar belakang. Namun, jika Anda keluar, sistem operasi akan menghentikan semua proses Anda, yang membunuh proses latar belakang Anda juga. Jika Anda menggunakan nohup Anda memberi tahu proses "abaikan perintah yang akan menghentikan Anda".
Martin Marconcini
1
@ George2: Ya. "kebal terhadap hangup" == "proses lanjutkan" dan "non-tty" == "keluar dari sesi konsol terminal"
Dijeda hingga pemberitahuan lebih lanjut.
32

Dalam skrip Bash shell, ampersand "&" digunakan untuk memotong proses:

find -name hello &

Ini akan menyebabkan perintah find forked dan dijalankan di latar belakang (Anda selalu dapat membunuhnya dengan PID-nya).

Martin Marconcini
sumber
Terima kasih Martin, seandainya saya menggunakan terminal ssh log ke mesin, kemudian menggunakan terminal ssh untuk mengeksekusi perintah (misalkan proses jangka panjang), maka jika saya keluar dari sesi terminal, maka proses jangka panjang perintah akan diakhiri dengan benar ? Dan jika saya menjalankan perintah menggunakan & di terminal ssh, bahkan jika saya keluar dari terminal, proses jangka panjang perintah masih berjalan, benar?
George2
1
Itu benar, George. Proses latar belakang harus berlanjut sampai mereka keluar atau Anda membunuhnya. Namun, seperti yang sudah ditunjukkan, Anda perlu nohup untuk menghindari proses mati ketika pengguna log off.
Martin Marconcini
Martin terima kasih! Saya ingin tahu mengapa kita perlu menggunakan keduanya & dan nohup, dan apa fungsi masing-masing yang membuat kita mencapai tujuan membiarkan perintah terus berjalan bahkan jika konsol terminal berhenti. Saya membaca halaman manual untuk nohup, dan disebutkan "jalankan perintah kebal terhadap hangup, dengan output ke non-tty", saya bingung apakah kekebalan terhadap hangup adalah apa yang Anda maksudkan membiarkan perintah terus berjalan tanpa terpengaruh oleh berhenti konsol terminal? Jika demikian, saya pikir menggunakan nohup sudah cukup, dan tidak perlu menggunakan &. Ada komentar?
George2
1
Anda harus menggunakan Keduanya, jika Anda tidak menggunakan &, terminal tidak akan membiarkan Anda memasukkan perintah lain. Cara terbaik bagi Anda untuk melihatnya, hanya mencobanya. Contoh yang baik adalah perintah yang membutuhkan waktu, seperti find: find -name SomeName /> somefile.txt coba dengan nohup dan & dan lihat perbedaannya.
Martin Marconcini
Ini memiliki jawaban yang bagus untuk pertanyaan nohup: serverfault.com/questions/311593/…
joshperry
26

Mengapa menjalankan perintah shell Linux dengan '&'?

Untuk mendapatkan prompt Anda kembali dengan segera, dan jalankan proses di latar belakang.

Apa fungsi mereka?

nohup memungkinkan proses latar belakang untuk terus berjalan bahkan setelah pengguna logout (atau keluar dari shell yang memulai).

> & mengalihkan baik output standar dan kesalahan standar ke file log.

& menjalankan semuanya di latar belakang, memberi Anda konfirmasi segera.

Penjelasan:

Setiap proses Linux membuka tiga saluran I / O, input "stdin", output standar "stdout" dan output kesalahan standar "stderr". Mereka dapat digunakan untuk biner, tetapi secara tradisional teks. Ketika sebagian besar program melihat stdin dekat, mereka keluar (ini dapat diubah oleh programmer).

Ketika cangkang induk keluar, stdin ditutup pada anak-anak, dan (sering, biasanya) anak-anak juga keluar. Selain itu, anak-anak menerima sinyal perangkat lunak, SIGHUP, yang menunjukkan bahwa pengguna telah "menutup" (sebelumnya, modem) dan defaultnya di sini adalah untuk keluar juga. (Catatan, seorang programmer dapat mengubah semua ini saat menulis program).

Jadi, apa yang dilakukan nohup adalah memberi anak proses lingkungan I / O yang terpisah, mengikat seluk beluk ke sesuatu yang tidak terikat pada kulit induk, dan melindungi anak dari sinyal SIGHUP. Setelah pengguna terputus, Anda akan melihat proses latar belakang nohup yang dimiliki oleh init (proses 1), bukan shell pengguna.

Namun nohuptidak dapat melakukan pekerjaan sepenuhnya jika proses dijalankan di latar depan, sehingga &digunakan untuk menjalankan program di latar belakang, di mana ia dapat dengan senang hati tetap berjalan dengan atau tanpa pengguna masuk.

kmarsh
sumber
Misalkan saya menggunakan ssh terminal log ke mesin, kemudian menggunakan terminal ssh untuk mengeksekusi perintah (misalkan proses jangka panjang), maka jika saya keluar dari sesi terminal, maka proses jangka panjang perintah akan diakhiri dengan benar? Dan jika saya ingin perintah terus dijalankan bahkan jika saya keluar dari shell, haruskah saya menggunakan nohup, atau & (di akhir perintah) atau menggunakan nohup dan &?
George2
1
Benar, gunakan nohup dan & untuk proses untuk melanjutkan setelah SSH terputus.
kmarsh
Kmarsh terima kasih! Saya ingin tahu mengapa kita perlu menggunakan keduanya & dan nohup, dan apa fungsi masing-masing yang membuat kita mencapai tujuan membiarkan perintah terus berjalan bahkan jika konsol terminal berhenti. Saya membaca halaman manual untuk nohup, dan disebutkan "jalankan perintah kebal terhadap hangup, dengan output ke non-tty", saya bingung apakah kekebalan terhadap hangup adalah apa yang Anda maksudkan membiarkan perintah terus berjalan tanpa terpengaruh oleh berhenti konsol terminal? Jika demikian, saya pikir menggunakan nohup sudah cukup, dan tidak perlu menggunakan &. Ada komentar?
George2
1
Saya akan mengedit jawaban saya untuk menjawab.
kmarsh
13

Selain jawaban @ Martin: Penggunaan ampersand lainnya ( >&seperti di atas) adalah untuk menangkap keduanya stdoutdan stderr. Biasanya, jika Anda mengarahkan output ke file dengan hanya '>', Anda hanya akan mendapatkan output stdout, tidak ada kesalahan.

Abu
sumber
1. Terima kasih Ash, saya ingin mengkonfirmasi dengan Anda bahwa "> & <nama file log>", akan membuang semua stderr dan stdout ke file log, benar? 2. Dan menggunakan "> <nama file log>" akan membuang semua stdout ke file log, benar?
George2
1
@ George: Ya, itu benar.
Ash
Terima kasih Ash! Saya ingin tahu mengapa kita perlu menggunakan keduanya & dan nohup, dan apa fungsi masing-masing yang membuat kita mencapai tujuan membiarkan perintah terus berjalan bahkan jika konsol terminal berhenti. Saya membaca halaman manual untuk nohup, dan disebutkan "jalankan perintah kebal terhadap hangup, dengan output ke non-tty", saya bingung apakah kekebalan terhadap hangup adalah apa yang Anda maksudkan membiarkan perintah terus berjalan tanpa terpengaruh oleh berhenti konsol terminal? Jika demikian, saya pikir menggunakan nohup sudah cukup, dan tidak perlu menggunakan &. Ada komentar?
George2
4

Selain jawaban Martin dan Ash, terkadang Anda mungkin melihat penggunaan &&token. Ini digunakan untuk mengatakan "jalankan perintah kedua jika dan hanya jika perintah pertama berhasil dijalankan." Perintah yang ditulis dengan baik akan, jika memiliki kesalahan, tidak berhasil keluar.

[kevin@box ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[kevin@box ~]$ touch file
[kevin@box ~]$ ls file && echo removing file && rm file
file
removing file
[kevin@box ~]$
Kevin M.
sumber
Keren, Kevin! Misalkan saya menggunakan ssh terminal log ke mesin, kemudian menggunakan terminal ssh untuk mengeksekusi perintah (misalkan proses jangka panjang), maka jika saya keluar dari sesi terminal, maka proses jangka panjang perintah akan diakhiri dengan benar? Dan jika saya ingin perintah terus dijalankan bahkan jika saya keluar dari shell, haruskah saya menggunakan nohup, atau & (di akhir perintah) atau menggunakan nohup dan &?
George2
Salah satu akan bekerja. NOHUP adalah cara asli untuk melakukannya, saya bayangkan (tetapi saya benar-benar menebak-nebak), tetapi latar belakangnya bekerja sekarang. Perbedaan penting adalah ketika menjalankan shell interaktif dengan mengisap sistem remote. Proses NOHUP akan berjalan di latar depan, tetapi akan tetap berjalan jika Anda keluar, sedangkan proses latar belakang akan kembali segera setelah Anda menelurkan perintah. Tetapi ketika Anda mencoba untuk keluar dari shell interaktif dengan perintah yang berjalan di latar belakang, Anda diperingatkan terlebih dahulu.
Kevin M
2

Jawaban Martin bagus, tapi agak ambigu. Perintah selalu bercabang dan dijalankan, tetapi perilaku shell yang normal adalah menunggu perintah sampai keluar. Ampersand meletakkannya di latar belakang sehingga Anda mendapatkan terminal prompt kembali dan Anda dapat melakukan hal-hal lain. Jika proses memuntahkan data ke stdout atau stderr, ini akan dicampur dengan apa pun yang Anda lakukan saat diminta, dan dapat membingungkan Anda. Inilah sebabnya mengapa Anda mengarahkan ulang dengan> & /path/to/logfile.txt.

Menanggapi George2, perilaku normal untuk keluar shell adalah mengirim sinyal SIGHUP ke semua proses dalam kelompok proses yang sama (pada dasarnya hal-hal yang Anda hasilkan) dan mereka biasanya akan berakhir. Jika Anda ingin ini berlanjut bahkan jika Anda menutup proses shell, Anda dapat menggunakan perintah nohup untuk membuat mereka mengabaikan sinyal ini dan terus berjalan. Ada nama khusus untuk jenis proses ini, ini disebut proses daemon (diucapkan 'setan').

Homolka yang kaya
sumber
Rich terima kasih! Misalkan saya menggunakan ssh terminal log ke mesin, kemudian menggunakan terminal ssh untuk mengeksekusi perintah (misalkan proses jangka panjang), maka jika saya keluar dari sesi terminal, maka proses jangka panjang perintah akan dihentikan dengan benar? Dan jika saya ingin perintah terus dijalankan bahkan jika saya keluar dari shell, haruskah saya menggunakan nohup, atau & (di akhir perintah) atau menggunakan nohup dan &? Dan mengapa?
George2
Hei george, maaf saya merespons sangat terlambat. Ya, jika Anda keluar dari shell, proses jangka panjang akan dihentikan. Jika Anda ingin terus berjalan, Anda harus melakukan keduanya nohup (agar tidak dihentikan saat shell ditutup) dan & (untuk diletakkan di latar belakang, sehingga Anda dapat Crtl-D atau keluar dari shell Anda). Anda juga dapat melihat perintah setsid, yang akan memungkinkan proses Anda berjalan, setelah itu abaikan SIGHUP dengan cara yang sedikit berbeda.
Rich Homolka
Jawaban yang bagus, menjelaskan praktik terbaik untuk proses yang dimulai dengan shell yang dimulai.
Marcel Valdez Orozco