Linux后台运行程序有哪些具体方法?

摘要:当使用 SSH 进行远程代码运行时,控制端电脑通常不能出现任何意外。然而,运行深度学习等任务往往需要数小时甚至数天,这意味着我们不能随意关闭终端或 IDE。 一旦出现断电、断网、终端卡死等情况,远程任务也会被中断。 因此,将程序灵活、稳定地
当使用 SSH 进行远程代码运行时,控制端电脑通常不能出现任何意外。然而,运行深度学习等任务往往需要数小时甚至数天,这意味着我们不能随意关闭终端或 IDE。 一旦出现断电、断网、终端卡死等情况,远程任务也会被中断。 因此,将程序灵活、稳定地运行在服务器上,不受本地影响就很重要。 1 &后台运行(适合短任务) 在命令行最后加&,可让任务在后台运行。但关闭终端后任务会结束,不适合长任务。 # 后台运行 python ./test.py & # 查看进程 ps -ef | grep test.py # 终止进程 killall python # 或 kill PID ⚠️缺点 终端关闭即结束任务 无法直接查看日志 仅适合临时运行 2 nohup(稳定的长任务运行) nohup(no hang up)允许任务在退出终端后继续运行,并默认将输出写到 nohup.out 文件。 nohup python -u test.py > test.log 2>&1 & 参数说明: -u:关闭输出缓存(日志实时写入) > test.log:重定向标准输出到日志文件 2>&1:将标准错误(2)重定向到标准输出(1),这样两者都写入日志 &:后台运行 常用操作: # 实时查看日志 tail -f test.log # 查找进程 ps -ef | grep test.py # 或 pgrep -af python 3 disown(补救已经启动的任务) disown 可将当前 shell 中的任务移出作业控制,使其在退出终端后继续运行。 使用步骤: # 启动任务(前台运行) python myscript.py # Ctrl+Z 暂停任务 bg # 让任务在后台运行 disown -h %1 # 使用 disown 移除作业,%1 为 jobs 列表中的作业号 ps aux | grep myscript.py # 检查后台任务 选项说明: -h:阻止 shell 在退出时发送 HUP 信号 %1:作业号,通过 jobs 查看 ⚠️ 注意 必须是当前 shell 已启动的任务 不能恢复终端输出,适合意外需要后台运行的情况 举个例子 启动一个前台任务python myscript.py 暂停任务并放到后台,按下 Ctrl+Z 暂停任务,这会将任务置于后台并暂停状态。你会看到类似如下的输出: [1]+ Stopped python myscript.py 然后,使用bg命令将任务在后台继续运行: 这会继续执行任务,并且不会占用前台终端。你会看到类似如下的输出: [1]+ python myscript.py & 使用 disown 移除作业 现在,使用 disown 命令将该作业从 shell 的作业列表中移除: disown -h %1 这里的 %1 是作业号,如果你有多个作业,可以通过 jobs 命令查看作业列表,并确定正确的作业号。 disown 的选项 disown 默认情况下会从作业列表中移除指定的作业。 -h 选项会将作业标记为不发送 HUP 信号(挂起信号),即使终端关闭,作业也会继续运行。 检查后台任务 ps aux | grep myscript.py 4 screen(会话保持工具) screen 是一个终端复用器,可以在断开 SSH 后保持任务运行,并可再次连接。 基本用法: # 创建新会话 screen -S myjob # 分离会话(后台运行) Ctrl+A D # 查看会话列表 screen -ls # 重新连接会话 screen -r myjob # 退出会话(在 screen 中输入) exit 保存日志: screen -L -S myjob # 日志文件名为 screenlog.x 优缺点: ✅ 支持会话断开/恢复 ✅ 可运行多个程序 ❌ 功能相对简单,不如 tmux 灵活 滚轮翻页: 使用快捷键 [Ctrl + A] 然后按 [Esc] 进入滚动模式,按 q 退出滚动模式。 使用终端的滚动条:修改 screen 配置文件(通常是 ~/.screenrc 或 /etc/screenrc),添加以下内容: termcapinfo xterm* ti@:te@ 5 tmux(功能更强的终端复用器) tmux 是目前最强的终端多路复用器之一,比 screen 功能更多、可扩展性更好。
阅读全文