Ini adalah pertanyaan yang telah dibahas beberapa kali, tidak hanya di sini, tetapi juga di situs lain dari jaringan pertukaran stack (mis. Bagaimana membuat ssh untuk mematikan proses jarak jauh ketika saya menyela ssh sendiri? ). Namun, saya tidak dapat membuat solusi apa pun berhasil untuk saya.
Saya menjalankan perintah melalui ssh. Setiap kali saya keluar ssh, saya ingin perintah untuk mati juga. Perintah ini adalah daemon bernama ktserver yang berjalan tanpa batas hingga Anda menekan Ctrl-C.
Saya menjalankannya sebagai berikut: ssh -t compute-0-1 ktserver
dan, memang, ketika saya menekan Ctrl-C, proses berakhir dengan anggun dan sesi ssh berakhir.
Namun, jika alih-alih menekan Ctrl-C, saya membunuh proses ssh menggunakan kill
perintah (misalnya, mengirim SIGINT atau SIGHUP), ktserver
prosesnya tetap hidup.
Bagaimana saya bisa membuat orang ktserver
mati selalu independen tentang bagaimana ssh
dibunuh?
EDIT : Jika, bukannya ktserver
saya menjalankan sesuatu yang sama sekali berbeda, seperti gedit
, semuanya berfungsi seperti pesona (yaitu gedit mati ketika koneksi mati). Karena itu, mungkin ada sesuatu yang salah dengan proses itu sendiri. Sebagai contoh, saya berpikir bahwa itu mungkin mengabaikan SIGHUP atau SIGINT. Namun, ketika saya menjalankan kill -1 ktserver
atau kill -2 ktserver
, proses mati seperti yang diharapkan.
EDIT2 : Seperti yang ditunjukkan oleh Mark Plotnick, masalah ini terkait dengan fakta bahwa tidak ada komunikasi yang beredar di saluran ssh. Saya telah mengkonfirmasi dengan menjalankan ssh -t <host> read
dan mematikan proses ssh sesudahnya. read
masih hidup dan menendang.
kill -9 ktserver
?ssh example.com dd ...
Pekerjaan saya sudah selesai sampai berjam-jam bahkan setelahssh
koneksi mati karena masalah jaringan. Jika Anda dapat mengubahktserver
untuk mengambil opsi untuk mengeluarkan sesuatu sesekali, itu mungkin merupakan solusi.read
di komputer jauh, dan setelah membunuh koneksi ssh,read
tidak mati. Sayangnya, saya tidak dapat mengubah ktserver untuk menghasilkan apa pun. Tidak ada solusi kalau begitu?shopt -s huponexit
). Bisakah Anda menguji apakah ini cocok untuk Anda?Jawaban:
Biasanya ketika koneksi ssh mati, shell juga mati. Anda dapat mengonfigurasi shell Anda untuk mengirim sinyal -1 (SIGHUP) ketika berakhir untuk semua anak-anaknya.
Untuk bash Anda dapat mengonfigurasi opsi ini melalui perintah shopin builtin . (
shopt -s huponexit
).Untuk zsh yang Anda inginkan .
setopt
HUP
sumber
ssh -t -t
, (perhatikan-t
dua kali!) Yang memaksa alokasi tty, bukan hanya pty.Saya menemukan bahwa hanya menggunakan
-t -t
sebagai argumen untukssh
membuatnya berfungsi. Saya tidak harus mengaturhuponexit
ke shell yang berasal atau jauh.Saya menguji ini sebagai berikut:
Tidak bekerja:
Ini membunuh sesi ssh, tapi saya bisa melihat proses tidur masih berjalan pada remote host (
ps -ef | grep sleep
menunjukkannya).Apakah berhasil:
Ini membunuh sesi ssh dan proses tidur jarak jauh juga terbunuh. Saya juga telah memverifikasi bahwa sinyal yang dikirim ke proses jarak jauh adalah
SIGINT
jika Anda menggunakan Control- C. Saya juga memverifikasi bahwa SIGKILL (-9) yang diterapkan padassh
proses juga akan mematikan proses jarak jauh.EDIT 1:
Itu adalah benar untuk
sleep
... untuk proses jauh lebih keras kepala, saya menemukan bahwassh
pegangan ^ C berbeda yang SIGINT. Ctrl- Cbekerja, tetapikill -INT $pid
tidakInilah yang akhirnya saya dapatkan yang berfungsi untuk aplikasi saya yang sebenarnya (mencuri dari jawaban lain).
Perhatikan penggunaan tanda kutip ganda dan tunggal. Perhatikan bahwa proses jarak jauh Anda HARUS menanggapi SIGHUP dengan benar-benar keluar!
sumber
cat
. Misalnya,ssh -ttq user@host '{ cmd; cmd; } | cat'
Ctrl-C
TIDAK selalu sama dengankill -INT $pid
, lihat jawaban saya di unix.stackexchange.com/questions/377191/… dan yang lain di stackoverflow.com/questions/8398845/... untuk detail lebih jelas ;-)^C
mengirim SIGINT . Jadi apa perbedaan yang tepat jika mereka tidak setara?Jika ssh tidak menyebarkan sinyal, ia menerima apa yang Anda harapkan darinya?
UPD. (khusus untuk JosephR): itu jelas merupakan kesalahan dalam pertanyaan itu sendiri yang mengikuti dari kesalahpahaman - "Bunuh proses yang ditimbulkan oleh ssh ketika ssh mati". SSH biasanya tidak menelurkan proses (terkadang memang demikian, tetapi ini adalah cerita lain), sebaliknya SSHD melakukannya, ketika kita melihat sisi lain dari koneksi. SSH hanya mengandalkan server remote abstraksi abseaksi terminal. Itu sebabnya satu-satunya hal yang dapat membantu ada kemampuan terminal untuk memancarkan sinyal ke proses terlampir. Ini agak sangat mendasar untuk setiap sistem mirip UNIX.
sumber
Solusi yang diposting di sini tidak bekerja untuk saya tetapi karena pertanyaan ini muncul pertama kali ketika saya sedang mencari solusi untuk masalah yang sama dan juga
-t -t
trik yang disebutkan di sini saya akan memposting solusi yang bekerja untuk saya untuk orang lain untuk mencoba.Perintah jangka panjang saya tidak berjalan lagi ketika koneksi terputus seperti ini.
sumber