Linux nohup 命令完全指南:让进程永不掉线
以下是一篇详细的 nohup
使用教程,涵盖基础到进阶场景,结合实战案例和常见问题解答:
一、nohup 是什么?
nohup
(No Hang Up)是 Linux/Unix 系统中用于**忽略挂断信号(SIGHUP)**的命令,能让进程在终端关闭后继续运行。配合 &
符号使用,可实现后台任务的无中断执行。
二、基础用法
1. 启动后台任务
nohup your-command &
- 示例:后台运行 Python 脚本
nohup python3 app.py &
- 效果:
- 立即返回进程 PID(如
[1] 12345
) - 默认将输出写入当前目录的
nohup.out
文件
- 立即返回进程 PID(如
2. 自定义输出文件
nohup your-command > custom.log 2>&1 &
- 解释:
>
重定向标准输出到custom.log
2>&1
将标准错误(stderr)合并到标准输出(stdout)
- 示例:分离输出和错误日志
nohup java -jar server.jar > stdout.log 2> error.log &
三、核心功能场景
场景1:SSH 断开后保持服务运行
问题:直接运行 java -jar app.jar
,关闭 SSH 后进程终止
解决方案:
nohup java -jar app.jar > /var/log/app.log 2>&1 &
场景2:实时监控日志
需求:启动后台任务的同时跟踪日志
nohup ./start.sh & tail -f nohup.out
- 使用
tail -f
持续查看输出(Ctrl+C 退出监控,不影响后台进程)
场景3:后台运行耗时任务
示例:压缩大型目录
nohup tar -czvf backup.tar.gz /data > compression.log 2>&1 &
- 通过
ps -ef | grep tar
检查进程状态
四、进阶技巧
1. 关闭终端后保持进程活跃
错误认知:nohup command & exit
并不能保证进程存活
正确方式:
# 启动时直接分离进程与终端
nohup command > /dev/null 2>&1 &
disown -h %1
2. 结合管道和复杂命令
需求:运行包含管道的命令
nohup sh -c 'cat access.log | grep "ERROR" > errors.txt' > pipe.log 2>&1 &
3. 后台任务管理
操作 | 命令 |
---|---|
查看所有后台任务 | jobs -l |
恢复任务到前台 | fg %任务编号 |
终止任务 | kill -9 PID |
查看完整进程树 | pstree -p PID |
五、常见问题解答
Q1:nohup 和 screen/tmux 有什么区别?
工具 | 特点 | 适用场景 |
---|---|---|
nohup | 轻量级,仅保持进程运行 | 简单后台任务 |
screen | 可断线重连的虚拟终端 | 需要交互的长时间任务 |
tmux | 更强大的终端复用器(分屏、会话共享) | 复杂运维场景 |
Q2:nohup.out 文件无限增长怎么办?
解决方案:
- 定期清理
echo "" > nohup.out # 清空内容(保留文件句柄)
- 使用 logrotate
# /etc/logrotate.d/nohup /path/to/nohup.out { daily rotate 7 compress missingok notifempty }
Q3:如何让 nohup 任务开机自启?
推荐方案:通过 systemd 服务管理
# /etc/systemd/system/myapp.service
[Unit]
Description=My Background Service
[Service]
ExecStart=/usr/bin/nohup /path/to/your-command
Restart=always
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start myapp
systemctl enable myapp
六、最佳实践总结
- 始终重定向输出:避免
nohup.out
失控增长 - 结合
disown
使用:确保进程完全脱离终端 - 重要服务用 systemd:替代简单的 nohup 方案
- 日志分级管理:分离 stdout/stderr,方便问题排查
附:命令速查表
需求 | 命令模板 |
---|---|
简单后台运行 | nohup command & |
自定义日志路径 | nohup command > log 2>&1 & |
完全脱离终端控制 | nohup command > /dev/null 2>&1 & disown |
查看后台任务 | jobs -l 或 `ps aux |
掌握这些技巧后,你可以轻松应对服务器维护、批量数据处理、长期运行服务等场景!