【问题标题】:Bash: Using SSH to start a long-running remote command and collect its PIDBash:使用 SSH 启动长时间运行的远程命令并收集其 PID
【发布时间】:2014-06-30 13:01:56
【问题描述】:

当我执行以下操作时,我必须在之后按CTRL-c,否则外壳会表现得很奇怪。左/右箭头键,例如移动不正确,文字乱七八糟。

# 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

【问题讨论】:

  • 不应该是“睡眠 50 && echo $!” ?
  • 然后等待sleep完成。
  • 为什么需要sleep 50
  • @ExplosionPills 用我感兴趣的实际命令更新了 OP。
  • @fmcato :OP 正在创建一个僵尸进程并打印其 PID。 Jasmine:你需要关闭进程的stdin/stderr/stdout,这样进程才能真正分离。

标签: linux bash ssh pid


【解决方案1】:

试试这个:

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 启动之前,因此您获得的$! 是最近启动的本地后台的PID过程)。

【讨论】:

    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多