无断开烦恼!远程服务器后台运行程序的3种方法:nohuptmuxscreen

Uninterrupted Remote Program Execution: 3 Methods

在数据分析或机器学习项目中,经常需要在远程服务器上运行耗时长、计算密集型的任务。通过SSH连接到远程服务器是常见的操作方式。但是,如何确保在断开SSH连接之后,远程服务器上的程序能够继续运行呢?本文详细介绍了三种方法:nohuptmuxscreen

使用nohup命令

开始

  1. 连接到远程机器:在本地终端中执行以下命令。

    1
    ssh username@remote-server-address
  2. 启动后台程序:在远程机器上执行。

    1
    nohup your-command-to-run-the-program &

例如:

1
nohup python train_model.py &

此方法会将程序的输出重定向到一个名为nohup.out的文件中。

结束

在远程机器上执行以下命令。

  1. **查找程序的进程ID (PID)**:

    1
    ps aux | grep your-command-to-run-the-program
  2. 结束进程

    1
    kill -9 PID
  3. 输出含义:
    当你执行如下命令:

1
nohup python train_model.py &

你可能会看到这样的输出:

1
2
[1] 337082
nohup: ignoring input and appending output to 'nohup.out'

这里,

  • 1 337082 表示该任务现在在后台运行,PID(进程ID)为337082。
    • 337082: 这是该后台作业对应的进程ID (PID)。你可以使用这个PID来监视或结束该进程。
  • nohup: ignoring input and appending output to ‘nohup.out’ 表示该进程现在将忽略任何输入,并将输出追加到 nohup.out 文件。
    • 这是 nohup 命令的标准消息,含义如下:
      • ignoring input: 当你使用 nohup 命令,它将不会接收任何从终端输入的数据。这意味着,一旦你使用 nohup 启动了一个程序,你不能再向它提供任何交互式输入(除非程序有其他的输入方法)。
      • appending output to 'nohup.out': 默认情况下,nohup 会将程序的输出重定向到一个名为 nohup.out 的文件中。所以,如果你的程序在执行过程中产生了任何输出(如打印语句),这些输出都会被写入到 nohup.out 文件中。如果该文件之前不存在,nohup 会自动创建它;如果文件已存在,nohup 会将新的输出追加到文件的末尾。
      • 如果你想查看程序的输出,你可以使用 cattail 命令来查看 nohup.out 文件的内容。例如,使用 tail -f nohup.out 可以实时查看该文件的末尾内容,这对于监视程序的运行状态很有用。

使用tmux

开始

  1. **安装tmux**:在远程机器上执行以下命令。
  • Ubuntu/Debian
    1
    sudo apt-get install tmux # Ubuntu/Debian
  • MacOS
    1
    brew install tmux
  1. 连接到远程机器:在本地终端中执行。

    1
    ssh username@remote-server-address
  2. 开始新的tmux会话:在远程机器上执行。

    1
    tmux

然后在tmux会话内运行您的程序。

  1. 断开会话:在远程机器上按 Ctrl+b d

结束

在远程机器上执行以下命令。

  1. 重新连接到tmux会话

    1
    tmux attach
  2. 结束程序和会话:使用Ctrl+c结束程序,然后按Ctrl+b再按x结束tmux会话。

使用screen

开始

  1. **安装screen**:在本地终端中执行。
  • Ubuntu/Debian
    1
    sudo apt-get install screen # Ubuntu/Debian
  • MacOS
    1
    brew install screen
  1. 连接到远程机器:在本地终端中执行。

    1
    ssh username@remote-server-address
  2. 开始新的screen会话:在远程机器上执行。

    1
    screen

然后在screen会话内运行您的程序。

  1. 断开会话:在远程机器上按 Ctrl+a d

结束

在远程机器上执行以下命令。

  1. 重新连接到screen会话

    1
    screen -r
  2. 结束程序和会话:使用Ctrl+c结束程序,然后按Ctrl+a再按k结束screen会话。

特殊情况:macOS用户

macOS用户可以使用Homebrew来安装tmuxscreen

  • 安装tmux

    1
    brew install tmux
  • 安装screen

    1
    brew install screen