
当误删正在运行的 nohup.out 文件后,进程仍会继续执行但不再写入日志;本文介绍如何在不终止 java 迁移任务等长时间运行进程的前提下,安全恢复标准输出与错误输出的重定向。
当误删正在运行的 nohup.out 文件后,进程仍会继续执行但不再写入日志;本文介绍如何在不终止 java 迁移任务等长时间运行进程的前提下,安全恢复标准输出与错误输出的重定向。
nohup 命令本身不会动态管理日志文件的生命周期——它仅在启动时将 stdout/stderr 重定向到 nohup.out(或指定文件),之后完全依赖内核的文件描述符(file descriptor)机制。当你执行 rm nohup.out 时,实际删除的是文件系统中的目录项(inode 链接),但只要进程仍持有该文件的打开句柄(fd 1 和 fd 2),数据仍会持续写入原 inode 对应的磁盘空间。此时 nohup.out 在文件系统中“消失”,但其内容并未立即释放,且新输出仍被追加——只是你无法通过文件名访问它。
✅ 正确恢复方法(无需重启进程):
利用 /proc/<PID>/fd/ 查看并重建日志文件链接:
-
定位目标进程 PID(例如你的 shell 脚本或 Java 进程):
ps aux | grep "myScript\|java -jar" # 假设 PID = 12345
-
检查当前 stdout/stderr 是否仍指向已删除的 nohup.out:
ls -l /proc/12345/fd/{1,2} # 输出示例:1 -> /path/to/nohup.out (deleted) # 表明输出仍在写入,但文件已被 unlink -
恢复可访问的日志文件(推荐方式):
直接从 /proc/<PID>/fd/1 复制当前缓冲内容,并保持后续追加(需 root 或同用户权限):# 创建新日志文件(保留历史 + 后续追加) cp /proc/12345/fd/1 nohup.out.recovered 2>/dev/null # 若需实时追加新输出,可使用 tail -f(但注意:不能直接重定向 fd1,因 nohup 不支持运行时重定向) tail -n +1 -f /proc/12345/fd/1 >> nohup.out.live 2>/dev/null &
⚠️ 重要提醒:
- nohup 不支持运行时修改输出目标。rm nohup.out 后无法让 nohup “自动重建”该文件——这是内核级行为,非 nohup 控制。
- 不要尝试 kill -HUP 或其他信号强制重定向,Java 应用通常不响应 HUP 重开日志,且可能引发未定义行为。
- 更优实践:下次启动时显式重定向,避免依赖默认 nohup.out:
nohup java -jar app.jar > app.log 2>&1 & # 或合并输出并轮转(配合 logrotate) nohup java -jar app.jar &>> app.log &
? 总结:误删 nohup.out 不影响进程运行,但需主动从 /proc/<PID>/fd/ 恢复访问。长期方案是启动时明确指定日志路径,并考虑使用 systemd、supervisord 或日志轮转工具实现健壮性管理。

















