SSH远程执行后台命令无效求助:nohup与&为何无法让sleep 10立即返回?
解决SSH远程执行后台命令无法立即返回的问题
我明白你遇到的麻烦——本地用bash -c "nohup sleep 10 2> /dev/null &"能立刻返回,但通过SSH远程执行就非得等10秒才结束,这确实挺恼人的。
问题根源其实在SSH会话的特性:SSH会一直保持连接,直到远程端所有关联的进程关闭了所有和会话绑定的文件描述符(stdout、stderr这些)。你单独用nohup sleep 10 2> /dev/null &时,虽然重定向了stderr,但stdout还是默认关联着SSH的会话通道,所以SSH会等着这个流关闭才断开。
给你几个靠谱的解决思路:
1. 彻底重定向所有输出流
把stdout和stderr都重定向到/dev/null,让SSH没有需要等待的流:
ssh localhost 'nohup sleep 10 > /dev/null 2>&1 &'
这里> /dev/null是把标准输出扔去黑洞,2>&1是把标准错误也重定向到和标准输出一样的地方,这样所有输出都和SSH会话解绑了,命令就能立刻返回。
2. 搭配disown命令脱离shell作业列表
有时候即使重定向了输出,远程shell还是会把后台进程当作自己的作业,退出时会等待。这时候可以用disown把进程从作业列表里移除:
ssh localhost 'nohup sleep 10 > /dev/null 2>&1 & disown'
disown会告诉远程shell:这个后台进程和我没关系了,你退出不用等它。
3. 用screen/tmux后台托管进程(适合需要后续查看的场景)
如果之后还想查看这个进程的状态或者输出,可以用screen或者tmux创建一个后台会话:
ssh localhost 'screen -dmS sleep_task sleep 10'
-dmS参数是让screen在后台启动一个名为sleep_task的会话,执行sleep 10,SSH执行完就立刻断开,进程在screen里独立运行。
试一下第一种方法应该就能解决你的问题啦!
内容的提问来源于stack exchange,提问作者neubert
相关产品推荐
相关产品推荐

