【问题标题】:ssh run script in background and get its pid [duplicate]ssh 在后台运行脚本并获取其 pid [重复]
【发布时间】:2017-06-04 19:29:34
【问题描述】:


我需要让脚本的pid通过ssh运行。

ssh some.host './script &' #获取它的pid

到目前为止我正在尝试的一些代码:

ssh some.host './script & ;回声$! nohup ssh some.host '( ./script & );回声$! > PID'; ssh some.host 'cat thePID'

有什么建议吗?

【问题讨论】:

  • 顺便说一下,第二种方法的最大问题是它仅在子shell中设置$!,但随后它试图在父级中设置echo $!子shell退出后的那个子shell。
  • 顺便说一句,nohup 绝对不会做任何你自己做不到的事情。 ssh some.host './script </dev/null >/dev/null 2>&1 & echo "$!"; disown -a' 做了远程nohup 会做的所有有用 的事情,没有无用/有害的事情(比如创建nohup.out——如果你想记录stdout/stderr,自己用您通过为重定向指定 /dev/null 以外的目标来控制的文件名)。
  • 顺便说一句,如果你想用它来启动远程服务,更好的方法是使用适当的进程监控系统——runit、daemontools、upstart、systemd等;一旦某物被定义为服务,其中任何一个都提供命令来启动它们、停止它们、检查它们的状态等,而无需知道 PID。
  • 顺便说一句,我证明这是完全重复的,因为 & ; 语法错误是唯一真正错误的东西——如果 OP 尝试运行相同的在本地命令以排除 SSH 并对他们的问题提出minimal reproducible example,他们会遇到完全相同的问题。因此,这个问题的不同之处仅在于不够小(未能排除与手头实际问题无关的因素)。

标签: bash ssh


【解决方案1】:
ssh some.host './script & echo $!'

【讨论】:

  • 就目前而言绝对正确。也就是说,如果程序尝试写入 stdout 或 stderr(或从 stdin 读取,或在收到 SIGHUP 时退出),它可能会在 ssh 退出后被杀死。为避免这种情况,请考虑将它们重定向到文件或从文件中重定向,和/或使用disown 来防止在 shell 退出时发送 SIGHUP。
  • @Jakuje,它确实实际上在后台运行./script。单个& 是一个命令终止符,它将前面的命令置于后台。
【解决方案2】:

据我记忆,应该是这个-

./script & echo $!

没有

;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2020-03-11
    • 2019-01-26
    相关资源
    最近更新 更多