退出SSH会话后,如何让远程机器的iperf在bash脚本中持续运行
解决SSH远程启动iperf后登出进程终止的问题
嘿,我来帮你搞定这个困扰!你遇到的核心问题是:SSH会话结束时会给远程机器上的子进程发送SIGHUP信号,而你原来的脚本写法并没有让iperf真正脱离SSH会话的控制,所以登出后进程就跟着终止了。
先说说你原脚本的问题
你写的这段代码:
ssh root@10.101.10.35 &>/dev/null & << EOF nohup iperf -s -B 192.168.99.1 &>/dev/null & EOF
这里的here-doc写法没有正确把命令传递给远程执行,而且即使传递成功,SSH会话的控制关系也没切断——当SSH进程结束时,远程的iperf进程还是会收到终止信号。
几种靠谱的解决方法
方法1:正确使用SSH + nohup
把远程要执行的命令直接作为SSH的参数,让nohup在远程机器上完全接管进程:
ssh root@10.101.10.35 "nohup iperf -s -B 192.168.99.1 &>/dev/null &"
nohup会让iperf忽略SIGHUP信号,避免SSH会话结束时被终止&>/dev/null把标准输出和错误输出都重定向到/dev/null,防止生成nohup.out文件- 最后的
&让iperf在远程后台运行
方法2:用setsid创建独立会话
如果nohup还是不生效,可以试试setsid,它会给iperf创建一个全新的会话,彻底脱离SSH的会话组:
ssh root@10.101.10.35 "setsid iperf -s -B 192.168.99.1 &>/dev/null"
这种方式不需要加最后的&,因为setsid已经让进程在独立后台运行了。
方法3:用screen/tmux持久化会话(适合需要后续查看的场景)
如果你之后还需要连接到远程机器查看iperf的运行状态,screen或tmux是更好的选择:
# 使用screen ssh root@10.101.10.35 "screen -dmS iperf_server iperf -s -B 192.168.99.1"
之后想要重新查看会话,可以执行:
ssh root@10.101.10.35 "screen -r iperf_server"
-dmS参数表示在后台启动一个名为iperf_server的screen会话,运行iperf服务,即使SSH登出,screen里的进程也会继续运行。
验证方法
执行完命令后,你可以登出SSH,然后重新登录远程机器,用ps aux | grep iperf看看进程是否还在运行。
内容的提问来源于stack exchange,提问作者Giannis Pappas
相关产品推荐
相关产品推荐

