我有一个父脚本(start.py),其主要目的是启动后台进程并退出。当我直接ssh到remote_host并运行脚本时,它按预期工作。
[user@local_host ~]# ssh remote_host
user@remote_host's password: ****
[user@remote_host ~]# time python start.py --config_file /data/workload.pg
real 0m0.037s
user 0m0.025s
sys 0m0.012s
此脚本的退出代码:
[root@perf72 ~]# echo $?
0
为了简化,我不想先建立ssh会话并运行命令,而是想从local_host远程执行命令:
[user@local_host ~]# ssh -o StrictHostKeyChecking=no -i /tmp/tmpqcz5l5il user@remote_host -p 22 "python start.py --config_file /data/workload.pg"
real 12m6.594s
user 0m0.027s
sys 0m0.016s
这里的问题是ssh会话在后台进程的生命周期内保持打开状态,而不是start.py脚本的生命周期小于一秒。它应该在start.py脚本退出时断开连接,但它不会。
我是否需要start.py脚本中的特定sys.exit()信号,这将提示ssh会话断开连接?
答案 0 :(得分:1)
ssh正在等待被调用进程stdout
的输出,所以如果有的话可以打印它。该文件句柄由您正在生成的子进程继承,因此即使python脚本已退出,它仍然处于打开状态,只要它已打开,ssh就会一直等待。
如果更改ssh命令行以将远程脚本作为"python start.py --config_file /data/workload.pg > /dev/null"
运行,则ssh连接将在python脚本执行后立即关闭。