如何通过SSH让远程服务器执行带输入的后台任务并即时退出?
SSH启动后台进程后无法立即退出的解决方法
问题原因
你执行的命令中,sleep 100 &虽被放到后台,但它仍继承了SSH会话的标准输入、输出、错误文件描述符。SSH会等待所有关联的文件描述符关闭后才断开连接,因此会一直等待100秒直到sleep进程结束。
可行解决方案
重定向后台进程所有文件描述符:将后台进程的输入、输出、错误全部定向到
/dev/null,彻底切断和SSH会话的关联echo Hello | ssh user@host "cat > /tmp/foo.txt; sleep 100 > /dev/null 2>&1 < /dev/null &"使用
nohup工具:nohup能让进程脱离终端控制,默认将输出写入nohup.out,也可结合重定向避免生成日志文件# 保留nohup日志 echo Hello | ssh user@host "cat > /tmp/foo.txt; nohup sleep 100 &" # 禁用nohup日志 echo Hello | ssh user@host "cat > /tmp/foo.txt; nohup sleep 100 > /dev/null 2>&1 &"使用
disown命令:在后台进程启动后,用disown将其从当前Shell作业列表中移除,SSH会话就不会再等待该进程echo Hello | ssh user@host "cat > /tmp/foo.txt; sleep 100 & disown"
验证方式
执行修改后的命令后,SSH会立即退出。你可以通过以下命令确认后台进程是否在远程服务器正常运行:
ssh user@host ps aux | grep sleep
内容的提问来源于stack exchange,提问作者yegor256
相关产品推荐
相关产品推荐

