Mengapa SSH -t tidak menunggu proses latar belakang?


13

Mengapa itu ssh -ttidak menunggu pekerjaan latar belakang selesai?

Contoh:

ssh user@example 'sleep 2 &'

Ini berfungsi seperti yang diharapkan, karena ssh kembali setelah 2 detik, sedangkan

ssh user@example -t 'sleep 2 &'

tidak menunggu untuk sleepselesai dan segera kembali.

Adakah yang bisa menjelaskan alasan di balik ini? Apakah ada cara untuk membiarkan ssh -tsemua proses latar belakang selesai sebelum kembali?

Kasus penggunaan saya adalah saya memulai skrip ssh -t, dan skrip ini memulai beberapa pekerjaan latar belakang yang harus tetap hidup setelah skrip utama selesai. Dengan ssh -tini tidak mungkin sejauh ini.

Jawaban:


22

Tanpa -t, sshddapatkan 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, sshdjangan 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 sshdberinteraksi 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).


1
terima kasih atas jawaban yang menyeluruh! Hal lain yang ingin saya ketahui: apakah semua proses latar belakang berakhir setelah terminal semu keluar? skrip yang saya mulai memulai layanan, yang bekerja dengan baik dengan ssh. tetapi ketika menggunakan ssh -t, layanan belum dimulai. tampaknya layanan akan ditutup setelah ssh kembali.
Philipp Murry

Sebenarnya, ada cara bagi sisi master terminal pseudo-untuk mengetahui kapan semua deskriptor file slave telah ditutup. Itu mekanisme yang sama dipicu oleh terminal nyata ketika semua deskriptor file untuk itu telah ditutup, pada kenyataannya.
JdeBP


@JdeBP, maukah Anda memperluas? Saya tidak yakin apa yang Anda maksud. Emulator terminal AFAICT (setidaknya xterm dan gnome-terminal) tidak peduli tentang proses yang masih memiliki fds dibuka untuk budak ketika proses mereka mengeksekusi shell dalam dies
Stéphane Chazelas

@ PhilippMurry Anda dapat menggunakan nohupagar skrip tetap berjalan seperti itu. (Anda mungkin juga mempertimbangkan memulai pekerjaan yang sudah berjalan lama di dalam tmuxsehingga Anda dapat memantau kemajuan mereka secara interaktif, tetapi file log berfungsi dengan baik.)
jpaugh

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.