运行 分叉脚本时 SSH 会话保持打开状态
SSH session held open when running a forked script
我有一个父脚本 (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 会话断开连接?
ssh 正在等待被调用进程的 stdout
上的输出,因此它可以打印它(如果有的话)。该文件句柄由您生成的子进程继承,因此即使 python 脚本已退出,它仍然打开,只要它打开,ssh 就会一直等待。
如果您将 ssh 命令行更改为 运行 远程脚本 "python start.py --config_file /data/workload.pg > /dev/null"
,则 ssh 连接将在 python 脚本关闭后立即关闭。
我有一个父脚本 (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 会话断开连接?
ssh 正在等待被调用进程的 stdout
上的输出,因此它可以打印它(如果有的话)。该文件句柄由您生成的子进程继承,因此即使 python 脚本已退出,它仍然打开,只要它打开,ssh 就会一直等待。
如果您将 ssh 命令行更改为 运行 远程脚本 "python start.py --config_file /data/workload.pg > /dev/null"
,则 ssh 连接将在 python 脚本关闭后立即关闭。