nohup 日志停止写入,通常不是 nohup 本身的问题,而是进程、输出缓冲、文件系统或重定向方式导致的。下面按常见原因逐一说明,并给出排查方法。
很多程序在标准输出不是终端时,会启用全缓冲(block buffering),而不是行缓冲。
nohup.out 很久不更新nohup python app.py > nohup.out 2>&1 &
Python 在管道/文件下默认是块缓冲。
nohup python -u app.py > nohup.out 2>&1 &
或代码里:
print(x, flush=True)
nohup java -Djava.io.tmpdir=/tmp App > nohup.out 2>&1 &
Java 也有类似缓冲问题,可加日志框架或 System.out.flush()
日志不写 ≠ 日志丢了,可能是程序没产生新日志。
ps -ef | grep 程序名
top -p PID
strace -p PID
如果 CPU 为 0、无系统调用,通常是:
常见错误写法:
nohup ./app.sh &
# 但又在某处写了
./app.sh > other.log
或者:
ls -l /proc/PID/fd
看 1 和 2 指向哪里。
df -h
df -i
如果磁盘满:
rm nohup.out
进程仍然持有文件句柄,日志还在写,但你看不到文件。
ls -l /proc/PID/fd
找到被删文件,copy 出来:
cp /proc/PID/fd/1 recovered.log
或重启进程。
nohup ./app.sh > nohup.out &
错误日志可能跑到终端或丢失。
nohup ./app.sh > nohup.out 2>&1 &
setsid / disown / screen 导致混淆有时混用:
nohup setsid ./app &
日志行为可能不一致。
teenohup ./app | tee -a nohup.out 2>&1 &
systemd(生产环境)StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app.err
-u(Python)或关闭缓冲/proc/PID/fd 指向哪如果你愿意,可以贴出:
ps / ls -l /proc/PID/fd 输出我可以直接帮你定位是哪一类问题。