Pertanyaan Mengapa saya bisa melihat output dari proses latar belakang?


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

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


21
2017-08-18 08:23


asal




Jawaban:


Itu & mengarahkan shell untuk menjalankan perintah di latar belakang, yaitu, itu bercabang dan berjalan di sub-shell terpisah, sebagai pekerjaan, secara asinkron.

Perhatikan bahwa ketika Anda meletakkan & output - keduanya stdout dan stderr - akan tetap dicetak ke layar. Jika Anda tidak ingin melihat output apa pun di layar, alihkan keduanya stdout dan stderr ke file oleh:

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

Biasanya Anda mungkin ingin membuang stderr dengan mengalihkannya ke /dev/null jika Anda tidak khawatir tentang menganalisis kesalahan nanti.

Anda juga 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>

Itu job-number dapat diperoleh dengan berlari

jobs

32
2017-08-18 08:33



Jawaban yang bagus. Anda bisa memasukkan yang juga bisa digunakan /dev/null sebagai file untuk mengarahkan output terminal jika seseorang ingin membuang output daripada menyimpannya di suatu tempat. Dan saya benar itu 2>&1 pengalihan stderr untuk stdout? Mungkin Anda ingin mengklarifikasi itu juga ... Terima kasih. - Byte Commander
@ByteCommander Terima kasih :) diedit, harap sudah jelas sekarang. Ya kamu benar, 2>&1 pengalihan stderr untuk stdout. - Ron
Saya pikir itu akan layak disebut itu stty tostop akan menyebabkan pekerjaan latar belakang ditangguhkan jika mereka mencoba menulis ke terminal. - kasperd
cmd_with_params> / dev / null 2> / dev / null & - tgkprog


Ketika Anda menggunakan &, prosesnya berjalan di latar belakang. Tapi output standarnya masih terminal.

Bahkan, Anda bisa berlari ping 8.8.8.8 & dan find / -name '*test*' & pada saat yang sama (menghasilkan output campuran), tetapi Anda tidak dapat berjalan ping 8.8.8.8 dan 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 mempelajarinya nohup dan disown.


8
2017-08-18 08:33



disown tidak mencegah output dicetak ke terminal. - Ruslan
@Ruslan: tidak, tetapi menghapus pekerjaan dari shell. Yang mungkin (atau mungkin tidak) menjadi sesuatu yang mungkin tertarik OP. - Andrea Corbellini