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?

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.