如何在SSH连接断开后终止Raspberry Pi上已启动的程序?
解决SSH断开时自动终止Raspberry Pi上的程序
核心原因
你遇到的问题是因为默认情况下,当SSH会话没有绑定伪终端(TTY)时,远程启动的进程在SSH断开后会被系统的init进程接管,变成孤儿进程继续运行。要让进程随SSH会话一起终止,关键是让进程和SSH会话的终端绑定,这样会话断开时进程会收到SIGHUP信号并终止。
解决方案:给SSH命令添加-t参数
最简单有效的方法是在你的SSH命令中加上-t选项,强制分配伪终端。这样远程运行的Python程序会和这个终端绑定,当SSH连接断开(xterm关闭)时,终端被销毁,进程会收到SIGHUP信号,默认情况下Python程序会自动终止。
修改后的bash脚本如下:
#!/usr/bin/bash -f xterm -title "Pi1" -hold -e ssh -t -i $HOME/.ssh/key_rsa "pi@192.168.0.107" "python3 collpre.py" & xterm -title "Pi2" -hold -e ssh -t -i $HOME/.ssh/key_rsa "pi@192.168.0.108" "python3 test.py"
额外补充
-t参数的作用:强制SSH分配一个伪终端,即使当前输入不是终端(这里xterm提供了终端环境,但显式指定-t能确保远程进程和终端强绑定)。- 如果你的Python程序有自定义信号处理逻辑、忽略了
SIGHUP,可以在远程命令中显式捕获并终止进程,比如:
这个命令会在收到ssh -t -i $HOME/.ssh/key_rsa "pi@192.168.0.107" "trap 'kill %1' SIGHUP; python3 collpre.py"SIGHUP时杀死后台的Python进程,不过对于直接运行的前台进程,-t参数通常已经足够满足需求。
内容的提问来源于stack exchange,提问作者Alfred Wächter
相关产品推荐
相关产品推荐

