nohup 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,属于 Shell 内建命令族(见Shell 内建命令)。关掉终端,任务别跟着死。
nohup(no hang up)让命令忽略 SIGHUP(终端挂断信号),这样你退出登录/关闭终端后,它还在跑。常配合 & 后台使用。
一、基本用法
bash
nohup long_task.sh & # 后台跑,退出终端也不停
# 输出默认写到 ./nohup.out
nohup cmd > run.log 2>&1 & # 重定向输出到自己指定的日志
nohup cmd &是经典组合:&后台、nohup防终端关闭导致被杀。不重定向的话,stdout/stderr 都进nohup.out。
二、为什么要 nohup
bash
# 普通后台进程:终端关掉 → 收到 SIGHUP → 进程被杀
# nohup 进程:忽略 SIGHUP → 终端关掉照样跑终端(session)关闭时,shell 会向它的作业发
SIGHUP。nohup让目标进程忽略这个信号,从而"孤儿"后由 init/systemd 接管继续运行。
三、与 disown / setsid 的区别
bash
cmd & disown # 从 shell 作业表移除,关终端不被发 SIGHUP
setsid cmd & # 在新 session 运行,彻底脱离终端
nohup cmd & # 忽略 SIGHUP,但仍在原作业表
disown是"让 shell 别给你发信号";setsid是"直接开新会话脱离";nohup是"收到信号也不理"。现代更推荐setsid或systemd托管长期任务,nohup是轻量临时方案。
四、实战:临时跑长期任务
bash
nohup ./backup.sh > /var/log/backup.log 2>&1 &
echo "PID: $!" # 记下 pid 方便后续 kill不想写 service 文件、又想关终端后任务继续,用 nohup 最快。但生产长期服务还是建议写成 systemd unit,便于管理、开机自启、日志轮转。
相关命令
一句话总结
nohup = 忽略 SIGHUP、关终端仍运行:nohup cmd & 后台且抗终端关闭(输出默认进 nohup.out,建议自己重定向);原理是忽略终端挂断信号。与 disown(移出作业表)、setsid(开新会话脱离,更彻底)分工;临时长期任务用 nohup,生产服务建议 systemd 托管。