Dari apa yang bisa saya kumpulkan.
Pekerjaan latar belakang diblokir dari membaca terminal pengguna. Ketika seseorang mencoba melakukannya, itu akan ditangguhkan sampai pengguna membawanya ke latar depan dan memberikan beberapa masukan. "membaca dari terminal pengguna" dapat berarti langsung mencoba membaca dari terminal atau mengubah setelan terminal.
Biasanya itu yang Anda inginkan, tetapi terkadang program membaca dari terminal dan/atau mengubah pengaturan terminal bukan karena mereka memerlukan input pengguna untuk melanjutkan, tetapi karena mereka ingin memeriksa apakah pengguna mencoba memberikan input.
http://curiousthing.org/sigttin-sigttou-deep-dive-linux memiliki detail teknis yang mengerikan.
Di Linux dan sistem Unix lainnya, pekerjaan yang berjalan di latar belakang, tetapi masih memiliki stdin
(atau std::cin
) yang terkait dengan terminal pengontrolnya (a.k.a. jendela tempat dijalankannya) akan dikirimi SIGTTIN
sinyal, yang secara default menyebabkan program dihentikan sepenuhnya, sambil menunggu pengguna membawanya ke latar depan (fg %job
atau serupa) untuk memungkinkan input benar-benar diberikan ke program. Untuk menghindari program dijeda dengan cara ini, Anda dapat:
- Pastikan program
stdin
saluran tidak lagi dikaitkan dengan terminal, baik dengan mengalihkannya ke file dengan konten yang sesuai untuk dimasukkan oleh program, atau ke/dev/null
jika benar-benar tidak membutuhkan input - mis.myprogram < /dev/null &
. - Keluar dari terminal setelah memulai program, yang akan menyebabkan asosiasi dengan
stdin
program untuk pergi. Tapi ini akan menyebabkanSIGHUP
untuk dikirim ke program (artinya saluran input/output mengalami "hangup") - ini biasanya menyebabkan program dihentikan, tetapi hal ini dapat dihindari dengan menggunakannohup
- mis.nohup myprogram &
.
Jika Anda benar-benar tertarik untuk menangkap keluaran program, ini mungkin opsi terbaik, karena ini mencegah kedua sinyal di atas (serta beberapa lainnya), dan menyimpan keluaran untuk Anda lihat untuk menentukan apakah ada masalah dengan eksekusi program:
nohup myprogram < /dev/null > ${HOME}/myprogram.log 2>&1 &
Ya itu benar-benar dihentikan dan tidak lagi berfungsi di latar belakang. Untuk menghidupkannya kembali, ketik fg
nomor_pekerjaan