Saya memiliki skrip bash yang memulai skrip python3 (sebut saja startup.sh
), dengan baris kunci:
nohup python3 -u <script> &
Ketika saya ssh
masuk dan langsung memanggil skrip ini, skrip python terus berjalan di latar belakang setelah saya keluar. Namun, ketika saya menjalankan ini:
ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"
Proses berakhir segera setelah ssh
selesai menjalankannya dan menutup sesi.
Apa perbedaan keduanya?
EDIT: Skrip python menjalankan layanan web melalui Bottle.
EDIT2: Saya juga mencoba membuat skrip init yang memanggil startup.sh
dan menjalankan ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"
, tetapi mendapatkan perilaku yang sama.
EDIT3: Mungkin ada sesuatu yang lain dalam naskah. Inilah sebagian besar skrip:
chmod 700 ${key_loc}
echo "INFO: Syncing files."
rsync -azP -e "ssh -i ${key_loc} -o StrictHostKeyChecking=no" ${source_client_loc} ${remote_user}@${remote_hostname}:${destination_client_loc}
echo "INFO: Running startup script."
ssh -i ${key_loc} -o StrictHostKeyChecking=no ${remote_user}@${remote_hostname} "cd ${destination_client_loc}; chmod u+x ${ctl_script}; ./${ctl_script} restart"
EDIT4: Ketika saya menjalankan baris terakhir dengan tidur di akhir:
ssh -i ${key_loc} -o StrictHostKeyChecking=no ${remote_user}@${remote_hostname} "cd ${destination_client_loc}; chmod u+x ${ctl_script}; ./${ctl_script} restart; sleep 1"
echo "Finished"
Tidak pernah sampai echo "Finished"
, dan saya melihat pesan Server botol, yang belum pernah saya lihat sebelumnya:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
Saya melihat "Selesai" jika saya secara manual SSH masuk dan mematikan proses sendiri.
EDIT5: Menggunakan EDIT4, jika saya membuat permintaan ke titik akhir, saya mendapatkan halaman kembali, tetapi Botol keluar:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
----------------------------------------
Exception happened during processing of request from ('<IP>', 55104)
strace
jika Anda menggunakan Linux atau truss
jika Anda menjalankan Solaris dan melihat bagaimana / mengapa itu berakhir. Seperti misalnya ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> strace -fo /tmp/debug ./startup.sh
.
&
di akhir skrip start up? Menambahkan&
menghilangkan ketergantungan sesi ssh Anda dari menjadi id induk (ketika id orangtua mati begitu juga anak-anak mereka). Juga saya pikir ini adalah pertanyaan rangkap berdasarkan posting sebelumnya ini . Posting yang saya kirimkan kepada Anda dalam kalimat sebelumnya adalah duplikat dari posting ini yang mungkin memberikan detail yang lebih baik.
nohup ./startup.sh &
sebelumnya, tetapi memiliki perilaku yang sama. startup.sh
sudah mengandung fork ( nohup python3 -u <script> &
), jadi saya cukup yakin saya tidak perlu fork lagi.