ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Linux操作系统-如何在远程会话断开后保持程序一直运行?

Linux操作系统-如何在远程会话断开后保持程序一直运行?

在 Linux 服务器上工作,我们经常会遇到这样的场景:通过 SSH 远程连接到服务器,启动了一个耗时的训练任务或数据拷贝,但网络不稳定或需要关闭电脑时,任务就跟着终端一起中断了。如何让程序在终端关闭后依然稳定运行,是每个 Linux 用户的必修课。

本文将详细介绍两种最常用的方法:nohupscreen,并通过对比帮你选择最合适的方案。

一、为什么终端关闭,程序就没了?

在 Linux 系统中,当你关闭终端或断开 SSH 连接时,系统会向该终端下的所有进程发送一个SIGHUP(挂断)信号。大多数进程收到这个信号后,默认行为就是退出。因此,无论是前台任务还是单纯加&的后台任务,都难以幸免。

我们的目标,就是让程序“免疫”这个信号,或者干脆让它在一个独立的、不受终端影响的环境中运行。

二、方法一:nohup—— 简单直接的一次性后台运行

nohup是 “no hang up” 的缩写,它的核心作用就是让进程忽略 SIGHUP 信号

基本用法

最常用的命令格式如下:

nohup你的命令>output.log2>&1&

我们来拆解一下这个命令:

  • nohup:告诉系统,让后面的命令忽略 SIGHUP 信号。
  • 你的命令:你要运行的程序或脚本。
  • > output.log:将命令的标准输出重定向到output.log文件。
  • 2>&1:将命令的标准错误(2)也重定向到标准输出(1)所在的文件,即output.log。这样,所有的输出和报错信息都会被记录下来,方便排查问题。
  • &:将命令放到后台运行,释放当前的终端。

实际操作示例

假设我们要运行一个名为print.sh的shell脚本:

nohupshprint.sh&


执行后,终端会返回一个进程号(PID),并提示输出会写入nohup.out文件。此时,你就可以放心地关闭终端或断开 SSH 连接了,shell.sh会一直在后台运行并每隔5s打印一行“hello world”。退出当前会话,重新远程连接,任务依然在运行。

查看与管理

  • 查看输出:使用tail -f nohup.out可以实时查看程序的输出日志。
  • 查找进程:通过ps -ef | grep print可以找到后台进程的 PID。
  • 终止进程:使用kill PID命令可以结束该后台进程。

注意事项

  • 如果忘记重定向输出,nohup默认会将输出保存到当前目录下的nohup.out文件中。
  • nohup不会自动将进程转为后台,所以&是必需的。

三、方法二:screen—— 功能强大的会话管家

如果说nohup是“一锤子买卖”,那么screen就是一个功能强大的终端复用器(Terminal Multiplexer)。它创建一个虚拟终端会话,你可以随时分离(Detach)这个会话,让它安静地在后台运行,之后又可以随时重新连接(Reattach)回来,仿佛从未离开过。

安装screen

大多数 Linux 发行版默认没有安装screen,需要手动安装:

  • CentOS / RHEL / Fedorayum install -y screen
  • Ubuntu / Debianapt-get install -y screen

核心用法

screen的使用主要围绕以下几个命令:

  1. 创建会话screen -S mysession
    这会创建一个名为mysession的新会话,并自动进入。

  2. 在会话中运行程序:进入会话后,就像在一个正常的终端中一样,运行你的命令即可。

  3. 分离会话:在会话中,同时按下Ctrl + A,然后按D键。
    你会立即回到原来的终端,而screen会话及其中的所有程序都在后台继续运行。

  4. 查看会话列表screen -ls
    这会列出所有处于Attached(已连接)或Detached(已分离)状态的会话。

  5. 恢复会话screen -r mysession
    这会重新连接到名为mysession的会话,你将回到之前的工作现场。

实际操作示例

  1. 创建一个名为session.1的会话:screen -S session.1
  2. 在会话里运行shell命令:while true;do echo 'hello world';sleep 5 ;done
  3. Ctrl + A,再按D分离会话。
  4. 断开 SSH 连接。
  5. 重新连上服务器,执行screen -r session.1,shell命令仍然在运行中。

进阶操作

screen会话中,Ctrl + A是快捷键的前缀,按下后再按其他键可以实现更多功能:

  • Ctrl + A,然后按C:在当前的screen会话中创建一个新窗口。
  • Ctrl + A,然后按N/P:切换到下一个 / 上一个窗口。
  • Ctrl + A,然后按K:强制关闭当前窗口。
  • 在窗口中输入exit或按Ctrl + D:正常退出并关闭当前窗口。

四、总结:nohupvsscreen,我该用哪个?

特性nohupscreen
核心功能忽略挂断信号,让进程在后台运行创建持久化的虚拟终端会话,可随时重连
交互性。启动后无法再与程序交互。可以随时重新连接到会话,进行交互
多任务管理不支持。每个命令需单独启动和管理支持。一个会话内可创建多个窗口,管理多个任务
易用性非常简单,一条命令即可中等,需要学习几个基本命令和快捷键
安装系统自带,无需安装需要额外安装
适用场景运行一次性的、无需交互的长期任务需要调试、交互、管理多个任务的复杂场景

简单来说:

  • 如果你只是要跑一个脚本,不需要再管它,用nohup是最快捷的选择。
  • 如果你需要随时查看进度、进行调试,或者同时管理多个任务screen是更专业、更强大的工具。

掌握nohupscreen,能让你在面对长时间运行的任务时更加从容,不再担心网络波动或意外断连。希望这篇博客能帮助你更好地管理 Linux 后台任务。

返回列表