【问题标题】:how to send ssh job to background如何将 ssh 作业发送到后台
【发布时间】:2012-01-01 08:27:45
【问题描述】:

我通过 ssh 登录到远程服务器并启动了一个 php 脚本。显然,这需要 17 个小时才能完成,有没有办法断开连接但保持脚本执行?我没有进行任何输出重定向,所以我看到了所有输出。

【问题讨论】:

标签: bash ssh io-redirection


【解决方案1】:

您描述了保护脚本连续性很重要。不幸的是,我不知道,您与脚本进行任何交互,脚本是您制作的。

  1. 继续保护“屏幕”命令。你的连接会中断,但是屏幕保护伪终端,你可以稍后重新连接,见 man。
  2. 如果您不需要操作员与脚本交互,您只需在开始时将脚本置于后台,并将完整的输出记录到日志文件中。只需使用命令:

    nohup /where/is/your.script.php >output.log 2&>1 &
    

    >output.log 会将输出重定向到日志文件,2&>1 会将错误流附加到输出中,有效地附加到日志文件中。最后一个 & 会将命令置于后台。注意,nohup 命令会从终端组中分离进程。

    现在您可以安全地退出 ssh shell。因为您的脚本不在终端组中,所以它不会被杀死。它将从您的 shell 进程重新加入系统 INIT 进程。它类似于 Unix 系统行为。您可以使用命令监控的完整输出

    tail -f output.log   #allways breakable by ^C, it is only watching
    

    使用此方法,您无需使用 ^Z 、 bg 等 shell 技巧将命令置于后台。

注意,使用重定向到 nohup 命令是首选。否则 nohup 会自动将所有输出重定向到当前目录中的nohup.out 文件。

【讨论】:

    【解决方案2】:
    ctrl + z 
    

    将暂停它。比输入

    bg
    

    将其发送到后台。记下进程的PID,以备后用;)

    编辑:我忘了,你必须执行

    disown -$PID
    

    $PID 是你的进程的 pid

    之后,关闭终端后进程不会被杀死。

    【讨论】:

    • 如果结束shell进程,发送到后台的进程将无法检索。如果 SSH 连接断开,就会发生这种情况。
    • 这将允许他在同一个会话中处理其他事情,但如果他断开连接,这个后台进程将被杀死。
    • 是的 - 我忘了加上“disown”,抱歉。
    • 请不要使用这个,如果你不承认,你不能(轻易)再次掌握这个过程!还有更好的其他选择,例如使用screen
    【解决方案3】:

    您可以使用screen

    【讨论】:

      【解决方案4】:

      你现在可以停止这个过程吗?如果是这样,启动screen,启动进程并使用 ctrl-a 然后 ctrl-d 分离屏幕。稍后使用 screen -r 检索会话。

      这应该在大多数发行版中都可用,否则,肯定会为您提供一个包。

      【讨论】:

      • 如果你无法阻止它,你可以将终端窃取到与 reptyr 的屏幕会话中。见serverfault.com/questions/24425/…
      • 我对屏幕不熟悉,能不能详细解释一下?
      • 有趣的是 ^a^d 分离——我一直只使用 ^ad。
      猜你喜欢
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多