nohup 日志不更新,通常不是 nohup 本身的问题,而是输出缓冲、程序状态或文件指向导致的。下面按常见原因从高到低给你排查思路。
nohup.out 文件大小不变化很多语言(尤其是 Python、C/C++)在输出不是终端时会启用块缓冲,而不是行缓冲。
# 查看程序是否还在运行
ps -ef | grep your_program
# 查看文件是否被打开
lsof nohup.out
Python 示例
print("xxx", flush=True)
或启动时:
python -u your_script.py
C / C++
fflush(stdout);
setbuf(stdout, NULL);
nohup stdbuf -o0 ./your_program > nohup.out 2>&1 &
或
nohup stdbuf -oL ./your_program > nohup.out 2>&1 &
nohup.out 不更新logging.basicConfig(filename='app.log')
lsof -p <pid> | grep log
确认程序实际写的是哪个文件。
top -p <pid>
strace -p <pid>
如果 strace 没输出,程序可能:
nohup.out 不更新df -h 显示磁盘没释放rm 删除,但进程仍持有 fdlsof | grep deleted
# 重新打开日志
touch nohup.out
或重启程序(最稳妥)
nohup ./app >/dev/null 2>&1 &
这种情况日志本来就不会写。
df -h
mount | grep "read-only"
nohup ./your_program > app.log 2>&1 &
或带缓冲控制:
nohup stdbuf -oL ./your_program > app.log 2>&1 &
✔ 程序是否还在运行
✔ 输出是否被缓冲
✔ 日志是否写到别的文件
✔ 是否删除了 nohup.out
✔ 程序是否卡死
如果你愿意,可以把:
ps -ef | grep xxx 输出贴出来,我可以直接帮你定位是哪一类问题。