【发布时间】:2021-12-29 02:50:27
【问题描述】:
我想使用复合命令在后台远程执行一些非常短的命令,但我注意到 ssh 一直等到所有命令都执行完毕。我尝试了几个选项,结果如下:
time ssh $IP 'sleep 20 >/dev/null 2>&1 &'
real 0m1,776s
user 0m0,003s
sys 0m0,003s
time ssh $IP 'sh -c " sleep 20; " >/dev/null 2>&1 &'
real 0m1,850s
user 0m0,007s
sys 0m0,000s
time ssh $IP '( sleep 20; ) >/dev/null 2>&1 &'
real 0m1,742s
user 0m0,000s
sys 0m0,007s
time ssh $IP '{ sleep 20; } >/dev/null 2>&1 &'
real 0m21,876s # <--- ssh waits until sleep is over
user 0m0,003s
sys 0m0,003s
为什么在启动后台进程后 { } 会阻止 ssh 退出?
PS 目标机器运行带有 sh shell 的 QNX 7。不是 bash。
【问题讨论】:
-
有趣。我也想知道。但我猜需要远程
sh的确切版本。 -
我猜,ssh需要在远端创建一个sh进程,这个shell进程一直等到子进程完成。如果你改为运行
nohup sleep 20 &会发生什么? -
我无法复制它。另外,您的第三个和第四个案例有什么区别?他们看起来和我一模一样。
-
@Fravadona 第三个使用 ()。第一个使用 {;}
-
@user1934428 time ssh $IP "nohup sleep 20 &" 也等待 20 秒