Mengapa proses jarak jauh saya masih berjalan setelah membunuh sesi ssh?

15

Saya mengekor file log jauh dengan menjalankan perintah ini di shell lokal:

ssh remotemachine tail -100f /path/to/error_file

Ketika saya ctrl-c dari perintah ini, tampaknya ctrl-c membunuh proses ssh lokal dan membiarkan ekor saya berjalan di mesin jarak jauh. Saya mendapat kesan bahwa memutuskan koneksi akan mengirim sinyal hangup (karena saya tidak menggunakan nohup) dan mematikan prosesnya, tetapi itu jelas bukan masalahnya.

Adakah yang bisa menjelaskan lebih lanjut ketika sinyal hangup dikirim dan ketika tidak? Mesin jarak jauh adalah Ubuntu, dan shell lokal saya adalah OS X bash jika salah satu dari mereka membuat perbedaan.

Ryan Olson
sumber

Jawaban:

13

Perilaku ini berasal dari kurangnya terminal pengendali untuk proses yang berjalan. Ketika proses jarak jauh tidak memiliki terminal pengendali, proses ssh jarak jauh yang menangani sesi Anda tidak dapat mematikan perintah, yang dibiarkan menggantung dalam keadaan zombie untuk akhirnya dibersihkan oleh init.

Anda dapat menyiasatinya dengan menjalankannya dengan opsi -t, yang memberinya terminal pengendali. Ini akan menyebabkan proses berakhir ketika Anda ctrl-c perintah ssh Anda dari jarak jauh.

The -t opsi:

Paksa alokasi pseudo-tty. Ini dapat digunakan untuk menjalankan program berbasis layar yang sewenang-wenang pada mesin jarak jauh, yang dapat sangat berguna, misalnya saat mengimplementasikan layanan menu. Opsi -t ganda memaksa alokasi tty, bahkan jika ssh tidak memiliki tty lokal.

Lihatlah man ssh dan man sshd ketika Anda menggunakan opsi ini karena ada implikasi lain dari memiliki terminal pengendali, misalnya kemampuan untuk mengirim karakter escape.

Nagul
sumber