Mengapa saya bisa melihat output dari proses latar belakang?

31

Misalnya, ketika saya mengetik ping 8.8.8.8 &, mengapa kita bisa melihat proses ping berfungsi? Dan ketika saya mengetik find / -name '*test*' &, itu juga terlihat di monitor.

Mengapa demikian? Apakah itu tidak benar-benar di latar belakang?

Tanpa pagar
sumber

Jawaban:

43

The &mengarahkan shell untuk menjalankan perintah di latar belakang, yaitu, itu bercabang dan berjalan dalam sub-shell terpisah, sebagai pekerjaan, asynchronous.

Perhatikan bahwa ketika Anda meletakkan &output - stdout dan stderr - masih akan dicetak ke layar . Jika Anda tidak ingin melihat output apapun pada layar, mengarahkan baik stdoutdan stderruntuk file dengan:

myscript > ~/myscript.log 2>&1 &

Biasanya Anda mungkin ingin membuangnya stderrdengan mengarahkan ulang ke /dev/nulljika Anda tidak khawatir menganalisis kesalahan nanti.

Anda bahkan dapat menjalankan perintah / skrip pada saat yang sama, di sub-shell terpisah. Untuk misalnya;

./script1 & ./script2 & ./script3 & 

Pekerjaan latar belakang dapat dibawa kembali ke baris perintah sebelum selesai dengan perintah:

fg <job-number>

The job-numberdapat diperoleh dengan menjalankan

jobs
Ron
sumber
Jawaban yang bagus. Anda dapat menyertakan bahwa seseorang juga dapat menggunakan /dev/nullsebagai file untuk mengarahkan ulang keluaran terminal jika seseorang ingin membuang output alih-alih menyimpannya di suatu tempat. Dan aku benar bahwa 2>&1pengalihan stderrke stdout? Mungkin Anda ingin mengklarifikasi itu juga ... Terima kasih.
Byte Commander
@ByteCommander Terima kasih :) sudah diedit, harap jelas sekarang. Ya, Anda benar, 2>&1dialihkan stderrke stdout.
Ron
3
Saya pikir akan layak disebutkan yang stty tostopakan menyebabkan pekerjaan latar belakang ditunda jika mereka mencoba menulis ke terminal.
kasperd
cmd_with_params> / dev / null 2> / dev / null &
tgkprog
Satu-satunya downside dari melakukan itu adalah bahwa urutan output ke stdout dan stderr dapat tercampur dalam file log.
matthieu
8

Saat Anda menggunakan &, proses sedang berjalan di latar belakang. Tetapi output standarnya masih terminal.

Bahkan, Anda dapat menjalankan ping 8.8.8.8 &dan find / -name '*test*' &pada saat yang sama (menghasilkan output campuran), tetapi Anda tidak dapat menjalankan ping 8.8.8.8dan find / -name '*test*'pada saat yang sama pada shell yang sama.

Jika Anda tidak ingin melihat apa pun, gunakan sesuatu seperti ping 8.8.8.8 &> /dev/null &.


Selain itu, Anda mungkin ingin mempelajari nohupdan disown.

Andrea Corbellini
sumber
disowntidak mencegah keluaran dari dicetak ke terminal.
Ruslan
@Ruslan: tidak, tetapi menghapus pekerjaan dari shell. Yang mungkin (atau mungkin tidak) menjadi sesuatu yang menarik bagi OP.
Andrea Corbellini