Linux系统下如何保持进程在SSH客户端断开后仍继续运行?

方案选择

为防止 SSH 会话关闭导致正在运行的命令被中断,请根据需求选择以下任一方案。

方案一:使用nohup&命令

nohup 命令可使命令在终端关闭后继续运行,& 符号可将进程置于后台运行。

  1. 将命令置于后台执行。

    将输出及错误重定向至自定义的[your_log_file]文件中。

    sudo nohup [your_command] >[your_log_file] 2>&1 &
    以后台执行bash hello.sh并将输出写入当前目录的新文件output.log为例,需执行sudo nohup bash hello.sh > output.log 2>&1 &
  2. 查看命令输出内容。

    sudo tail -f [your_log_file]
  3. 结束进程。

    重要

    结束进程会结束命令或任务,请谨慎操作。

    1. 查看进程PID。[your_command]替换为1后台执行的指令。

      sudo ps aux | grep "[your_command]"
      以执行sudo nohup bash hello.sh > output.log 2>&1 &为例,需执行sudo ps aux | grep "bash hello.sh"
    2. 使用sudo kill [进程PID]>命令结束进程。

方案二:使用 screen工具

  1. 安装screen工具。

    • Alibaba Cloud Linux、CentOS类型

      sudo yum install -y screen
    • Debian、Ubuntu类型

      sudo apt-get install -y screen
  2. 创建并进入新会话。

    [Name]为自定义会话名称。

    screen -S [Name]
    以创建一个名为mysession的会话为例,需执行sudo screen -S mysession,在新会话中执行命令。
  3. 在新会话中执行目标任务。

  4. 分离会话。

    同时按下Ctrl+A+D键,分离当前 screen 会话,此时进程在SSH客户端断开后仍可继续运行。

  5. 恢复会话。

    1. 查看会话进程PID,用于后续恢复。

      sudo screen -ls
      There is a screen on:
              2046.mytask     (Detached)
      1 Socket in /run/screen/S-root.

      示例中screen会话进程PID2046

    2. 恢复对后台任务的控制。

      [PID]为上一步获取的PID。

      sudo screen -r -d [PID]
      以恢复会话进程PID2046的会话为例,需执行sudo screen -r -d 2046
  6. 注销会话。

    重要

    注销会话会结束在此会话中执行命令或任务,请谨慎操作。

    [PID]请替换为4.a获取的会话进程PID

    sudo kill [PID]