我写了一支长时间运行的程式,在运行过程中会持续产生讯息至stdout,我不想太
频繁的读写储存空间,所以我目前以
$my_app > /dev/shm/my_app.log
的方式运行程式,将讯息输出到内存构成的档案系统中,当想要看即时讯息时以
$tail -f /dev/shm/my_app.log
的方式将输出讯息显示到终端,目前运行的还不错,但考虑到如果程式持续运行超过
一个月,我的/dev/shm/可能会不够,请问有没有什么方法让my_app.log在超过指定
行数的时候,清除最顶端开始的n行呢?
谢谢。
作者:
Adama (So Say We All.)
2021-12-22 23:19:00改成写进Redis然后设定Expire XD或者可以试logrotate
你要不要直接放在 tmux 里面跑?只有看最后的 log 的话
作者:
jkchang (JK)
2021-12-23 08:21:00sed '1,nd' infile > outfile #删顶端1~n行tail -n +2 infile > outfile #删顶端1行,依此类推awk NR\>n infile > outfile #删顶端1~n行
作者:
bitlife (BIT一生)
2021-12-23 12:35:00没真的测试过仅提供想法,用stat测试fd 1,如果S_IFBLK显示为block device(被输出导向),就定期 lseek 到档案开头以上未经实际测试,可行性不敢保证更正,应该用truncate而非lseek
我记得鸟哥在讲crontab的时候有提到类似的应用
作者:
bitlife (BIT一生)
2021-12-24 09:54:00今早特地man了一下,必须再更正 XD 是ftruncate才对
能够用 logrotate 一般要配合程式可以收 SIGHUP 信号一般主要是可以重读设定与关闭重开之前的 log 档案这样子就可以让 log 的写入重新开启处理若是你用 > 这类重导要考虑问题就比较少因为 io 重导是 shell 帮你处理的,所以常见就是上面提到 truncate, 一般 shell像是 true > file.log