Linux 后台运行命令:从基础到进阶
在 Linux 中,将命令放在后台运行是提高工作效率的重要技巧,尤其适合处理耗时任务(如程序部署、数据备份等)。本文将详细介绍后台运行命令的方法、进程管理及持久化方案。
基础:用 & 让命令后台运行
最简单的后台运行方式是在命令末尾添加 &,使命令脱离当前终端的直接控制:
1 | # 示例:后台运行 Java 程序 |
特点:
- 命令立即返回终端控制权,可继续输入其他命令;
- 命令输出(stdout/stderr)仍会显示在当前终端;
- 进程与终端会话绑定,关闭终端会导致进程终止(收到
SIGHUP信号)。
管理后台进程:jobs 与 fg/bg
使用 & 启动的后台进程属于当前终端的 “作业(job)”,可通过以下命令管理:
查看后台进程
1 | jobs [-l] |
- 不加参数:显示作业编号、状态(运行中
Running或停止Stopped)和命令; -l:额外显示进程 PID(进程 ID),便于后续操作(如终止进程)。
示例输出:
1 | [1] 3245 Running java -jar test.jar & |
[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 | # 后台运行 Test 程序,输出默认保存到 nohup.out |
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 | # 编辑定时任务 |
- 任务由系统进程
cron管理,与用户终端无关,即使未登录也会执行。
进阶:使用 screen 或 tmux 管理会话
对于需要交互式操作的后台任务(如远程部署时逐步输入命令),screen 或 tmux 工具更适合,它们允许创建 “虚拟终端会话”,断开连接后会话仍保持运行。
screen 基本用法
1 | # 安装(部分系统默认未安装) |
终止后台进程
若需停止后台运行的进程,可通过以下方式:
已知 PID 时:
1
kill -9 PID # -9 表示强制终止,确保进程退出
通过作业编号:
1
kill -9 %作业编号 # 如 kill -9 %1
通过命令名:
1
2
3pkill 命令名 # 如 pkill java
# 或更精确地
killall 命令名