[问题] stdout redirection应用问题

楼主: icetofux   2021-12-22 20:51:29
我写了一支长时间运行的程式,在运行过程中会持续产生讯息至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
作者: Bencrie   2021-12-23 00:45:00
你要不要直接放在 tmux 里面跑?只有看最后的 log 的话
作者: jkchang (JK)   2021-12-23 08:21:00
sed '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
作者: penut85420 (PenutGGorz)   2021-12-24 07:05:00
我记得鸟哥在讲crontab的时候有提到类似的应用
作者: bitlife (BIT一生)   2021-12-24 09:54:00
今早特地man了一下,必须再更正 XD 是ftruncate才对
作者: kenduest (小州)   2021-12-24 17:08:00
能够用 logrotate 一般要配合程式可以收 SIGHUP 信号一般主要是可以重读设定与关闭重开之前的 log 档案这样子就可以让 log 的写入重新开启处理若是你用 > 这类重导要考虑问题就比较少因为 io 重导是 shell 帮你处理的,所以常见就是上面提到 truncate, 一般 shell像是 true > file.log

Links booklink

Contact Us: admin [ a t ] ucptt.com