我有一个bash脚本,它启动python3脚本(我们称之为startup.sh
),其关键是:
nohup python3 -u <script> &
当我ssh
直接进入并调用此脚本时,退出后,python脚本将继续在后台运行。但是,当我运行此命令时:
ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"
该过程一旦ssh
完成运行就结束,并关闭会话。
两者有什么区别?
编辑:python脚本正在通过Bottle运行Web服务。
EDIT2:我还尝试创建一个初始化脚本,该脚本调用startup.sh
并运行ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"
,但行为相同。
EDIT3:也许是脚本中的其他内容。这是大部分脚本:
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服务器消息:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
如果我手动进行SSH并自己终止该进程,我会看到“完成”。
EDIT5:使用EDIT4,如果我向任何端点发出请求,我都会返回页面,但是Bottle错误出了:
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
。
nohup ./startup.sh &
过,但是它具有相同的行为。startup.sh
已经包含一个叉子(nohup python3 -u <script> &
),所以我很确定不需要再次叉子。