Tôi có một tập lệnh bash khởi động tập lệnh python3 (hãy gọi nó startup.sh
), với dòng khóa:
nohup python3 -u <script> &
Khi tôi ssh
trực tiếp và gọi tập lệnh này, tập lệnh python tiếp tục chạy trong nền sau khi tôi thoát. Tuy nhiên, khi tôi chạy nó:
ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"
Quá trình kết thúc ngay sau khi ssh
chạy xong và đóng phiên.
Sự khác biệt giữa hai là gì?
EDIT: Kịch bản python đang chạy một dịch vụ web thông qua Chai.
EDIT2: Tôi cũng đã thử tạo một tập lệnh init gọi startup.sh
và chạy ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"
, nhưng có hành vi tương tự.
EDIT3: Có lẽ đó là một cái gì đó khác trong kịch bản. Đây là phần lớn của tập lệnh:
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: Khi tôi chạy dòng cuối cùng với một giấc ngủ ở cuối:
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"
Nó không bao giờ đến được echo "Finished"
và tôi thấy thông báo máy chủ Chai mà tôi chưa từng thấy trước đây:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
Tôi thấy "Đã hoàn thành" nếu tôi tự thủ công SSH và tự hủy quá trình.
EDIT5: Sử dụng EDIT4, nếu tôi yêu cầu bất kỳ điểm cuối nào, tôi sẽ nhận lại được một trang, nhưng lỗi Chai:
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
nếu bạn đang sử dụng Linux hoặc truss
nếu bạn đang chạy Solaris và xem cách thức / lý do tại sao nó chấm dứt. Ví dụ như ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> strace -fo /tmp/debug ./startup.sh
.
&
phần cuối của kịch bản khởi động chưa? Việc thêm &
sẽ lấy đi sự phụ thuộc của phiên ssh của bạn từ id của cha mẹ (khi id cha mẹ chết thì con cái của họ cũng vậy). Ngoài ra tôi nghĩ rằng đây là một câu hỏi trùng lặp dựa trên này bài trước. Các bài tôi gửi đến bạn trong câu trước là bản sao của này bài mà có thể cung cấp chi tiết tốt hơn.
nohup ./startup.sh &
trước đây, nhưng nó có hành vi tương tự. startup.sh
đã chứa một ngã ba rồi ( nohup python3 -u <script> &
), vì vậy tôi khá chắc chắn rằng mình không cần phải rẽ nhánh nữa.