【问题标题】:Why curly brackets won't put remote ssh execution in background为什么大括号不会在后台执行远程 ssh
【发布时间】: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 &amp; 会发生什么?
  • 我无法复制它。另外,您的第三个和第四个案例有什么区别?他们看起来和我一模一样。
  • @Fravadona 第三个使用 ()。第一个使用 {;}
  • @user1934428 time ssh $IP "nohup sleep 20 &" 也等待 20 秒

标签: linux bash ssh qnx


【解决方案1】:

引自手册:

在大括号之间放置命令列表会导致列表在当前 shell 上下文中执行。没有创建子shell。

如果没有子shell,我想它不能在后台运行。

【讨论】:

  • 也许但是使用 bash 它确实在后台运行(刚刚测试过)。根据 OP,sleep 20 &gt;/dev/null 2&gt;&amp;1 &amp; 也在后台运行,而没有 subshel​​l。
  • 只运行 { sleep 20; } &gt;/dev/null 2&gt;&amp;1 &amp; 在交互式 ssh 中调用时进入主机和目标机器上的 bg。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 2020-07-02
  • 2020-05-17
  • 2014-05-07
  • 2020-10-22
  • 2020-12-04
  • 2012-12-09
相关资源
最近更新 更多