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?
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:
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.
/dev/null
sebagai file untuk mengarahkan ulang keluaran terminal jika seseorang ingin membuang output alih-alih menyimpannya di suatu tempat. Dan aku benar bahwa2>&1
pengalihanstderr
kestdout
? Mungkin Anda ingin mengklarifikasi itu juga ... Terima kasih.2>&1
dialihkanstderr
kestdout
.stty tostop
akan menyebabkan pekerjaan latar belakang ditunda jika mereka mencoba menulis ke terminal.Saat Anda menggunakan
&
, proses sedang berjalan di latar belakang. Tetapi output standarnya masih terminal.Bahkan, Anda dapat menjalankan
ping 8.8.8.8 &
danfind / -name '*test*' &
pada saat yang sama (menghasilkan output campuran), tetapi Anda tidak dapat menjalankanping 8.8.8.8
danfind / -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
nohup
dandisown
.sumber
disown
tidak mencegah keluaran dari dicetak ke terminal.