
nohup.out是nohup命令的默认输出日志文件,直接删除会导致正在写入的进程报错,推荐以下 4 种安全清空方式(按优先级排序),无需停止运行中的程序。
一、最推荐:快速清空(保留文件,不中断进程)
这是生产环境最常用的方式,直接清空文件内容但保留文件本身(进程写入不会中断):
bash
# 核心命令(覆盖为空文件)
> nohup.out
# 等价写法(效果相同,任选其一)
echo "" > nohup.out
# 或
cat /dev/null > nohup.out
✅ 优点:
- 瞬间完成,不影响正在写入日志的进程;
- 保留文件权限和所属用户,避免进程因文件不存在报错;❌ 注意:执行时需确保当前目录是
nohup.out所在目录,或指定完整路径(如> /opt/app/nohup.out)。
二、分场景清空方案
场景 1:nohup.out 过大(按大小切割 / 轮转)
若文件已达数 GB,清空后很快又会变大,建议先切割日志再清空(避免一次性丢失所有日志):
bash
# 1. 先备份当前日志(保留最近记录)
cp nohup.out nohup.out.bak.$(date +%Y%m%d%H%M)
# 2. 清空原文件
> nohup.out
# 3. 可选:压缩备份文件节省空间
gzip nohup.out.bak.202603111600
场景 2:进程正在写入,需实时清空
若担心 > nohup.out 瞬间清空时丢失少量日志,可使用 truncate 命令(更温和):
bash
# 截断文件为 0 字节(保留文件属性)
truncate -s 0 nohup.out
场景 3:想保留最后 N 行,清空其余内容
若需保留最近的日志记录,仅清空历史内容:
bash
# 保留最后 1000 行,其余清空
tail -n 1000 nohup.out > nohup.out.tmp && mv nohup.out.tmp nohup.out
场景 4:彻底删除并重建(需重启进程)
仅适用于可重启的进程(不推荐生产环境):
# 1. 停止写入该文件的进程(假设进程名是 app.jar)
ps -ef | grep app.jar | grep -v grep | awk '{print $2}' | xargs kill -9
# 2. 删除文件
rm -f nohup.out
# 3. 重建空文件(恢复权限)
touch nohup.out
chmod 644 nohup.out # 保持原权限
# 4. 重启进程
nohup java -jar app.jar &
❌ 注意:未停止进程直接删除文件,进程仍会往「已删除的文件句柄」写入,新日志不会出现在新建的 nohup.out 中,直到进程重启。
三、关键注意事项
-
避免直接删除文件 :进程运行时删除
nohup.out,操作系统会保留文件句柄,进程继续写入「不可见的临时文件」,导致磁盘空间仍被占用,且新日志无法查看。 -
权限问题 :执行清空命令的用户需有文件写入权限(如
chmod 664 nohup.out),否则会报Permission denied。 -
日志轮转(长期方案) :生产环境建议用
logrotate配置日志自动轮转,避免nohup.out无限增大:bash# 编辑 logrotate 配置 vi /etc/logrotate.d/app-nohup # 添加配置 /opt/app/nohup.out { daily # 每天轮转 rotate 7 # 保留7天日志 compress # 压缩旧日志 missingok # 文件不存在时不报错 notifempty # 空文件不轮转 create 644 root root # 重建文件的权限 }
四、验证清空结果
bash
# 查看文件大小(应为 0)
ls -lh nohup.out
# 输出示例:-rw-r--r-- 1 root root 0 Mar 11 16:00 nohup.out
# 查看文件内容(应为空)
cat nohup.out
总结
关键点回顾
- 核心命令 :
> nohup.out或cat /dev/null > nohup.out(安全清空,保留文件); - 生产环境优先:清空前先备份,避免丢失关键日志;
- 避坑要点 :
- 不要直接删除运行中进程的
nohup.out; - 清空后进程仍能正常写入,无需重启;
- 不要直接删除运行中进程的
- 长期方案 :用
logrotate配置日志自动轮转,替代手动清空。
按上述方法操作,可安全清空 nohup.out 且不影响正在运行的进程,是生产环境的最优实践。