远程跑实验,不想关机?怕断网?

208 阅读3分钟

如果你直接关闭终端,在终端中启动的程序通常会因为收到 SIGHUP 信号而停止运行。

要让程序在后台持续运行,并且在你关闭终端后不受影响,同时还能在下次登录时查看其输出,有几种常用的方法:

  1. 使用 nohup 命令 (最简单)

nohup 命令可以使程序忽略 SIGHUP 信号,从而在终端关闭后继续运行。你可以将程序的输出重定向到一个文件,以便后续查看。

用法:

1 nohup python your_script.py > output.log 2>&1 &

解释:

  • nohup: 确保程序在终端关闭后不会停止。
  • python your_script.py: 你要运行的 Python 脚本。
  • output.log: 将标准输出重定向到 output.log 文件。

  • 2>&1: 将标准错误输出也重定向到标准输出(即 output.log 文件)。这样,所有的输出(包括错误信息)都会写入这个文件。
  • &: 将整个命令放到后台运行。

查看结果:

  • 程序启动后,你会看到一个 PID(进程ID)。
  • 你可以随时使用 tail -f output.log 来实时查看输出。
  • 或者使用 cat output.log 查看完整输出。
  • 要停止程序,可以使用 kill 命令。
  1. 使用 screen 或 tmux (推荐,更强大)

screen 和 tmux 是终端复用工具,它们允许你创建持久化的终端会话。即使你关闭了 SSH 连接,会话也会在服务器上继续运行。当你再次登录时,可以重新连接到这些会话。

使用 screen

screen 通常在大多数 Linux 系统上预装。

基本用法:

  1. 启动一个新的 screen 会话:

1 screen -S my_session_name

  (my_session_name 是你给会话起的名字,方便识别)

2. 在 screen 会话中运行你的程序:

1 python your_script.py

  程序会像在普通终端中一样运行,并显示输出。

3. 分离 (Detach) screen 会话: 按下 Ctrl + A,然后松开,再按下 D 键。 你会回到原来的终端,并看到类似 "[detached from ...]" 的消息。此时,你的程序仍在 screen 会话中运行。

  1. 关闭终端或断开 SSH 连接。

  2. 重新连接 (Reattach) screen 会话: 当你再次登录服务器时,可以列出所有 screen 会话:

1 screen -ls

  然后重新连接到你的会话:

1 screen -r my_session_name

  (如果只有一个会话,可以直接 screen -r)

6. 结束 screen 会话: 在 screen 会话中,当你的程序运行完毕或你手动停止程序后,输入 exit 或按下 Ctrl + D 即可关闭 screen 会话。

使用 tmux

tmux 功能与 screen 类似,但通常被认为是更现代、更易用的替代品。如果你的系统没有预装,可能需要先安装 (sudo apt-get install tmux 或 sudo yum install tmux)。

基本用法:

  1. 启动一个新的 tmux 会话:

1 tmux new -s my_session_name

  1. tmux 会话中运行你的程序:

1 python your_script.py

  1. 分离 (Detach) tmux 会话: 按下 Ctrl + B,然后松开,再按下 D 键。

  2. 关闭终端或断开 SSH 连接。

  3. 重新连接 (Reattach) tmux 会话: 当你再次登录服务器时,可以列出所有 tmux 会话:

1 tmux ls

  然后重新连接到你的会话:

1 tmux attach -t my_session_name

  1. 结束 tmux 会话: 在 tmux 会话中,当你的程序运行完毕或你手动停止程序后,输入 exit 或按下 Ctrl + D 即可关闭 tmux 会话。

总结:

  • 如果你只是想简单地让一个命令在后台运行并记录输出,用 nohup 就足够了。
  • 如果你需要更灵活地管理后台任务,例如随时查看实时输出、暂停、恢复或在一个会话中运行多个命令,那么 screen 或 tmux 是更好的选择。推荐使用 screen,因为它通常是开箱即用的。