0%

后台运行命令

Linux 后台运行命令:从基础到进阶

在 Linux 中,将命令放在后台运行是提高工作效率的重要技巧,尤其适合处理耗时任务(如程序部署、数据备份等)。本文将详细介绍后台运行命令的方法、进程管理及持久化方案。

基础:用 & 让命令后台运行

最简单的后台运行方式是在命令末尾添加 &,使命令脱离当前终端的直接控制:

1
2
# 示例:后台运行 Java 程序
java -jar test.jar &

特点:

  • 命令立即返回终端控制权,可继续输入其他命令;
  • 命令输出(stdout/stderr)仍会显示在当前终端;
  • 进程与终端会话绑定,关闭终端会导致进程终止(收到 SIGHUP 信号)。

管理后台进程:jobsfg/bg

使用 & 启动的后台进程属于当前终端的 “作业(job)”,可通过以下命令管理:

查看后台进程

1
jobs [-l]
  • 不加参数:显示作业编号、状态(运行中 Running 或停止 Stopped)和命令;
  • -l:额外显示进程 PID(进程 ID),便于后续操作(如终止进程)。

示例输出

1
2
[1]  3245 Running                 java -jar test.jar &
[2] 4567 Stopped python script.py &
  • [1] 是作业编号,3245 是 PID。

切换进程到前台 / 后台

  • 将后台进程切换到前台

    1
    fg %作业编号  # %可省略,直接写编号

    示例:fg 1 将编号为 1 的后台进程切换到前台(需手动按 Ctrl+C 终止)。

  • 将暂停的进程切换到后台继续运行
    若进程被 Ctrl+Z 暂停(状态为 Stopped),可通过 bg 恢复运行:

    1
    bg %作业编号

持久化后台运行:脱离终端依赖

使用 & 运行的进程依赖终端,关闭终端会导致进程终止。解决这个问题的核心是让进程脱离终端会话,常用方案有两种:

nohup 命令:忽略挂断信号

nohup(no hang up)的作用是让命令忽略 SIGHUP 信号(终端关闭时发送的终止信号),从而在终端退出后继续运行。

基本用法

1
nohup 命令 &

示例

1
2
3
4
5
# 后台运行 Test 程序,输出默认保存到 nohup.out
nohup ./Test &

# 自定义输出位置(推荐)
nohup ./Test 1>/dev/null 2>error.log &
  • 1>/dev/null:将标准输出(stdout)重定向到 “黑洞”(不保存);
  • 2>error.log:将错误输出(stderr)保存到 error.log,便于排查问题。

更简洁的写法:将错误输出合并到标准输出:

1
nohup ./Test > output.log 2>&1 &
  • 2>&1 表示 “将 stderr 重定向到 stdout 相同的位置”(即 output.log)。

定时任务(crontab):系统级后台运行

若命令需要定期执行或长期运行,可将其添加到系统定时任务,完全脱离终端依赖:

1
2
3
4
5
# 编辑定时任务
crontab -e

# 添加一行(示例:每天凌晨 3 点运行备份脚本)
0 3 * * * /path/to/backup.sh > /var/log/backup.log 2>&1
  • 任务由系统进程 cron 管理,与用户终端无关,即使未登录也会执行。

进阶:使用 screentmux 管理会话

对于需要交互式操作的后台任务(如远程部署时逐步输入命令),screentmux 工具更适合,它们允许创建 “虚拟终端会话”,断开连接后会话仍保持运行。

screen 基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 安装(部分系统默认未安装)
sudo yum install screen # CentOS/RHEL
sudo apt install screen # Ubuntu/Debian

# 创建新会话
screen -S 会话名 # 如 screen -S deploy

# 在会话中运行命令(如启动服务)
java -jar test.jar

# 暂时离开会话(保留后台运行)
按 Ctrl+A 后再按 D

# 查看所有会话
screen -ls

# 重新进入会话
screen -r 会话名或ID

# 终止会话(在会话内按 Ctrl+D 或外部执行 screen -S 会话名 -X quit)

终止后台进程

若需停止后台运行的进程,可通过以下方式:

  1. 已知 PID 时

    1
    kill -9 PID  # -9 表示强制终止,确保进程退出
  2. 通过作业编号

    1
    kill -9 %作业编号  # 如 kill -9 %1
  3. 通过命令名

    1
    2
    3
    pkill 命令名  # 如 pkill java
    # 或更精确地
    killall 命令名

欢迎关注我的其它发布渠道