Bash:使用SSH启动长时间运行的远程命令并收集其PID

时间:2014-06-30 13:01:57

标签: linux bash ssh pid

当我执行以下操作时,我必须在之后按CTRL-c,否则shell会很奇怪。左/右箭头键,例如没有正确移动,文字搞砸了。

# read -r pid < <(ssh 10.10.10.46 'sleep 50 & echo $!') ; echo $pid
2135
# Killed by signal 2.
^C
#

我需要这个脚本,所以我想知道为什么需要CTRL-c并且可以解决它吗?

更新

看起来它会打开一个额外的Bash shell,而那就是需要退出的那个。

我真正感兴趣的命令是

read -r pid < <(ssh 10.10.10.46 "mbuffer -4 -v 0 -q -I 8023 > /tmp/mtest & echo $!"); echo $pid

1 个答案:

答案 0 :(得分:3)

请改为尝试:

read -r pid \
  < <(ssh 10.10.10.46 'nohup mbuffer >/tmp/mtest </dev/null 2>/tmp/mtest.err & echo $!')

三个重要变化:

  • nohup的使用(您也可以使用内置的bash disown获得类似的效果)
  • 将stdin和stderr重定向到文件(阻止它们保存最终连接到终端的句柄)。
  • 使用单引号作为远程命令(使用双引号,扩展在ssh开始之前发生,因此您获得的$!是最近启动的 local <的PID / em>后台处理)。