SSH远程执行含后台命令的脚本无法立即返回,如何解决?
解决SSH调用脚本后等待后台进程结束的问题
修改后的脚本
#!/bin/bash sleep 30 >/dev/null 2>&1 < /dev/null & echo "disowning" disown -a echo "done" exit
问题原因
你遇到的情况是因为sleep 30 &启动的后台进程默认继承了当前shell的标准输入、输出和错误流,而这些流和SSH会话的通道是绑定的。即便用disown分离了进程,SSH仍会等待所有关联的流关闭,因此要等sleep执行完才会返回。
关键修改说明
给sleep进程添加输入输出重定向:
>/dev/null:丢弃标准输出,避免输出流占用SSH会话通道2>&1:将标准错误重定向到标准输出,一并丢弃< /dev/null:让进程不再读取标准输入,彻底脱离会话的输入流
这样处理后,sleep进程完全和SSH会话的IO通道解绑,脚本执行完exit后,SSH会立即返回,而sleep会在机器A的后台继续运行。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

