Saya telah menulis skrip yang saya gunakan untuk mendorong dan menggunakan layanan baru ke beberapa mesin di bawah kendali saya, dan untuk menjalankan proses saya menggunakan ssh untuk memulai proses dari jarak jauh. Sayangnya, setiap kali saya menggunakan SSH untuk memulai proses, perintah SSH sepertinya tidak pernah kembali, menyebabkan script terhenti.
Perintah ini ditentukan sebagai: ssh $ user @ $ host "/ root / command &". Setiap kali saya menjalankan perintah sederhana, seperti ps atau siapa, perintah SSH segera kembali, namun ketika saya mencoba dan memulai proses saya, itu tidak kembali. Saya telah mencoba trik seperti membungkus proses saya dalam skrip bash sederhana yang memulai proses dan kemudian keluar, namun ini juga menggantung perintah SSH (bahkan jika skrip bash menggemakan pesan sukses, dan keluar secara normal).
Adakah yang tahu apa yang menyebabkan perilaku ini, dan bagaimana saya bisa mendapatkan perintah SSH untuk kembali segera setelah proses dimulai?
Terima kasih atas wawasan Anda!
Jawaban:
SSH menghubungkan stdin, stdout dan stderr dari remote shell ke terminal lokal Anda, sehingga Anda dapat berinteraksi dengan perintah yang berjalan di sisi jarak jauh.
Sebagai efek samping, itu akan terus berjalan sampai koneksi ini ditutup, yang terjadi hanya ketika perintah jarak jauh dan semua anak-anaknya (!) Telah berakhir (karena anak-anak, yang merupakan awal dari "&", mewarisi std * dari mereka proses induk dan tetap buka).
Jadi, Anda perlu menggunakan sesuatu seperti
<,> Dan 2> & 1 mengarahkan ulang stdin / stdout / stderr dari terminal Anda. Tanda "&" kemudian membuat skrip Anda masuk ke latar belakang. Dalam produksi Anda tentu saja akan mengarahkan ulang stdin / err ke logfile yang sesuai.
Lihat
http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html
Edit:
Hanya menemukan bahwa
< /dev/null
di atas tidak diperlukan (tapi mengarahkan stdout / err is ). Tidak tahu kenapa ...sumber
+1
! Bekerja untukku. Dan Anda juga dapat mencetak hasilnya dengan menggema file log:ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
Anda bisa mencoba nohup . Man nohup untuk detail lebih lanjut.
Jika Anda ingin menyimpan output pada mesin jarak jauh, inilah varian .
sumber
Alternatif lain adalah menyalakan yang terpisah
screen(1)
, seperti:Ini akan memulai layar terpisah (yang menangkap semua interaksi di dalamnya) dan kemudian segera kembali, mengakhiri sesi ssh.
Dengan sedikit kecerdikan, Anda dapat memecahkan panggilan perintah jarak jauh yang cukup rumit dengan cara ini.
sumber
sumber
Saya pikir cara yang benar adalah
sumber