ฉันมีสคริปต์ทุบตีที่เริ่มต้นสคริปต์ python3 (เรียกมันว่าstartup.sh
) โดยใช้บรรทัดสำคัญ:
nohup python3 -u <script> &
เมื่อฉันssh
เข้าใช้งานโดยตรงและเรียกสคริปต์นี้สคริปต์ python ยังคงทำงานในพื้นหลังหลังจากที่ฉันออก อย่างไรก็ตามเมื่อฉันเรียกใช้สิ่งนี้:
ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"
กระบวนการจะสิ้นสุดลงทันทีที่ssh
ดำเนินการเสร็จและปิดเซสชัน
ความแตกต่างระหว่างสองคืออะไร?
แก้ไข: สคริปต์หลามกำลังเรียกใช้บริการเว็บผ่านทางขวด
แก้ไข 2: ฉันยังพยายามสร้างสคริปต์เริ่มต้นที่เรียกstartup.sh
และเรียกใช้ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"
แต่ทำงานเหมือนเดิม
แก้ไข 3: อาจเป็นอย่างอื่นในสคริปต์ นี่คือส่วนใหญ่ของสคริปต์:
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: เมื่อฉันเรียกใช้บรรทัดสุดท้ายด้วยการนอนหลับตอนท้าย:
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"
ไม่เคยมาถึงecho "Finished"
และฉันเห็นข้อความเซิร์ฟเวอร์ขวดซึ่งฉันไม่เคยเห็นมาก่อน:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
ฉันเห็น "เสร็จสิ้น" ถ้าฉัน SSH ด้วยตนเองและฆ่ากระบวนการด้วยตนเอง
EDIT5: การใช้ EDIT4 ถ้าฉันทำการร้องขอไปยังจุดปลายใด ๆ ฉันจะได้หน้ากลับมา แต่ขวดผิดพลาด:
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
หากคุณใช้ Linux หรือtruss
หากคุณใช้งาน Solaris และดูว่า / ทำไมจึงยุติ ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> strace -fo /tmp/debug ./startup.sh
อย่างเช่น
&
สคริปต์ในตอนท้ายของสคริปต์เริ่มต้นทำงานหรือไม่ การเพิ่มช่วง&
เวลาที่ไม่ต้องพึ่งพาเซสชัน ssh ของคุณจากการเป็น id หลัก (เมื่อรหัสผู้ปกครองตายเช่นนั้นให้ลูก ๆ ทำ) นอกจากนี้ผมคิดว่านี่เป็นคำถามที่ซ้ำกันตามนี้โพสต์ก่อนหน้านี้ โพสต์ที่ฉันส่งถึงคุณในประโยคก่อนหน้านั้นซ้ำกับโพสต์นี้ซึ่งอาจให้รายละเอียดที่ดีกว่า
nohup ./startup.sh &
มาก่อน แต่มันมีพฤติกรรมเหมือนกัน startup.sh
มี fork แล้ว ( nohup python3 -u <script> &
) ดังนั้นฉันค่อนข้างมั่นใจว่าฉันไม่จำเป็นต้องแยกอีกต่อไป