Tanpa -t
, sshd
dapatkan stdout dari shell jarak jauh (dan anak-anak suka sleep
) dan stderr melalui dua pipa (dan juga mengirimkan input klien melalui pipa lain).
sshd
tidak menunggu proses di mana ia telah memulai shell login pengguna, tetapi juga, setelah proses itu telah berakhir menunggu eof pada pipa stdout (bukan pipa stderr dalam kasus openssh setidaknya).
Dan eof terjadi ketika tidak ada file deskriptor dengan proses apa pun yang terbuka pada akhir penulisan pipa, yang biasanya hanya terjadi ketika semua proses yang tidak memiliki stdout diarahkan ke sesuatu yang lain hilang.
Saat Anda menggunakan -t
, sshd
jangan gunakan pipa. Sebaliknya, semua interaksi (stdin, stdout, stderr) dengan remote shell dan anak-anaknya dilakukan dengan menggunakan satu pasangan terminal semu.
Dengan pasangan pseudo-terminal, untuk sshd
berinteraksi dengan sisi master, tidak ada penanganan yang sama atau cara apa pun untuk mengetahui apakah masih ada proses dengan fds terbuka ke sisi budak dari terminal pseudo, sehingga hanya menunggu penghentian dari proses di mana ia mengeksekusi shell login dari pengguna jarak jauh dan kemudian keluar.
Setelah keluar itu, sisi master dari pasangan pty ditutup yang berarti pty dihancurkan, sehingga proses yang dikendalikan oleh budak akan menerima SIGHUP (yang secara default akan menghentikan mereka).
nohup
agar skrip tetap berjalan seperti itu. (Anda mungkin juga mempertimbangkan memulai pekerjaan yang sudah berjalan lama di dalamtmux
sehingga Anda dapat memantau kemajuan mereka secara interaktif, tetapi file log berfungsi dengan baik.)Gunakan
wait
:sumber