后台运行命令
Linux 后台运行命令:从基础到进阶
在 Linux 中,将命令放在后台运行是提高工作效率的重要技巧,尤其适合处理耗时任务(如程序部署、数据备份等)。本文将详细介绍后台运行命令的方法、进程管理及持久化方案。
基础:用 & 让命令后台运行
最简单的后台运行方式是在命令末尾添加 &,使命令脱离当前终端的直接控制:
# 示例:后台运行 Java 程序
java -jar test.jar &
特点:
- 命令立即返回终端控制权,可继续输入其他命令;
- 命令输出(stdout/stderr)仍会显示在当前终端;
- 进程与终端会话绑定,关闭终端会导致进程终止(收到
SIGHUP信号)。
管理后台进程:jobs 与 fg/bg
使用 & 启动的后台进程属于当前终端的 “作业(job)”,可通过以下命令管理:
查看后台进程
jobs [-l]
- 不加参数:显示作业编号、状态(运行中
Running或停止Stopped)和命令; -l:额外显示进程 PID(进程 ID),便于后续操作(如终止进程)。
示例输出:
[1] 3245 Running java -jar test.jar &
[2] 4567 Stopped python script.py &
[1]是作业编号,3245是 PID。
切换进程到前台 / 后台
将后台进程切换到前台:
fg %作业编号 # %可省略,直接写编号示例:
fg 1将编号为 1 的后台进程切换到前台(需手动按Ctrl+C终止)。将暂停的进程切换到后台继续运行:
若进程被Ctrl+Z暂停(状态为Stopped),可通过bg恢复运行:bg %作业编号
持久化后台运行:脱离终端依赖
使用 & 运行的进程依赖终端,关闭终端会导致进程终止。解决这个问题的核心是让进程脱离终端会话,常用方案有两种:
nohup 命令:忽略挂断信号
nohup(no hang up)的作用是让命令忽略 SIGHUP 信号(终端关闭时发送的终止信号),从而在终端退出后继续运行。
基本用法:
nohup 命令 &
示例:
# 后台运行 Test 程序,输出默认保存到 nohup.out
nohup ./Test &
# 自定义输出位置(推荐)
nohup ./Test 1>/dev/null 2>error.log &
1>/dev/null:将标准输出(stdout)重定向到 “黑洞”(不保存);2>error.log:将错误输出(stderr)保存到error.log,便于排查问题。
更简洁的写法:将错误输出合并到标准输出:
nohup ./Test > output.log 2>&1 &
2>&1表示 “将 stderr 重定向到 stdout 相同的位置”(即output.log)。
定时任务(crontab):系统级后台运行
若命令需要定期执行或长期运行,可将其添加到系统定时任务,完全脱离终端依赖:
# 编辑定时任务
crontab -e
# 添加一行(示例:每天凌晨 3 点运行备份脚本)
0 3 * * * /path/to/backup.sh > /var/log/backup.log 2>&1
- 任务由系统进程
cron管理,与用户终端无关,即使未登录也会执行。
进阶:使用 screen 或 tmux 管理会话
对于需要交互式操作的后台任务(如远程部署时逐步输入命令),screen 或 tmux 工具更适合,它们允许创建 “虚拟终端会话”,断开连接后会话仍保持运行。
screen 基本用法
# 安装(部分系统默认未安装)
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)
终止后台进程
若需停止后台运行的进程,可通过以下方式:
已知 PID 时:
kill -9 PID # -9 表示强制终止,确保进程退出通过作业编号:
kill -9 %作业编号 # 如 kill -9 %1通过命令名:
pkill 命令名 # 如 pkill java # 或更精确地 killall 命令名