[程序运行/Java/Linux] Linux常用命令之【nohup】

1 nohup 命令

它是做什么的? no hang up

  • nohup(no hang up)= 忽略“挂断”信号(SIGHUP)。
  • 核心作用:让程序在终端关闭 / 退出登录后仍然继续运行,不会因为【会话断开】而被系统杀掉。

nohup 目标命令 > 日志 2>&1 & —— "后台跑,日志存文件,关了终端也不死。"

  • 原理:
  • 正常情况下,当你【关闭终端】或【退出 SSH 会话】,系统会向【该会话下运行的进程】发送 SIGHUP 信号,进程默认收到后退出。
  • 用 nohup 启动后,进程忽略这个信号,继续在后台跑。

注意:nohup 只负责"不怕终端关闭",不负责【程序崩溃恢复】,也不负责【开机自启】。要真正常驻后台 + 开机拉起,得配合 systemd 等工具。

常用方式

1. 基本用法(后台跑 + 日志落盘) | 最常见

nohup java -jar app.jar > app.log 2>&1 &
nohup java -Xms512m -Xmx1024m -cp . MyApp > myapp.out 2>&1 &
  • > app.log: 【标准输出】写入日志文件
  • 2>&1: 【错误输】出也一起写进同一日志
  • &: 放后台,命令立即返回
  • 如果不写 >,默认输出到 nohup.out(在当前目录生成)

2. 指定日志追加,保留历史

nohup java -jar app.jar >> app.log 2>&1 &

>> 追加而不是 > 覆盖,适合【反复启动】、想看【历史日志】。

3. 后台跑,不想留日志

nohup python app.py > /dev/null 2>&1 &

日志直接丢弃(/dev/null 是黑洞)。

4. 赋予更高优先级 / 丢到后端

nohup java -jar app.jar > app.log 2>&1 & disown

disown 把任务从 shell 作业表中移除,更彻底地【解绑终端】。

关键细节

点 说明
nohup.out 不指定重定向时,默认在当前目录生成 nohup.out,不想要可删除或重定向
日志文件权限 默认 644;【多人场景】可用 umask 或先创建调整
如何查看还在不在 ps -ef | grep app.jar 或 jps(Java)
如何停止 只能 kill <PID>,nohup 不提供停止能力

对比:nohup vs 其他后台方式

方式 终端关闭后存活 说明
nohup xxx & ✅ 最常用,忽略 SIGHUP
setsid xxx & ✅ 新会话运行,更彻底脱离终端
( xxx & ) ✅ 子 shell 后台运行
仅 xxx & ❌ 会随终端关闭被杀
systemd 服务 ✅ + 自动重启 生产环境最佳方案

Y 推荐文献

X 参考文献

posted @ 2026-10-24 09:22  千千寰宇  阅读(10)  评论(0)    收藏  举报