使用命名管道进行日志记录

使用命名管道进行日志记录

我有很多代码需要守护进程,以便打印到标准输出。我正在考虑使用以下 shell 脚本创建一个命名管道,这样我就可以在将进程的输出重定向到管道的同时对其进行 nohup。

/bin/bash #!/bin/bash

###############3
# 创建一个名为 pipename 的管道,该管道将重定向到 filename 并在 Cc 上轮换日志
###############3

如果 [ $# -ne 2 ]; 那么
    echo "使用方法:./$0 管道名 文件名"
    退出 -1

管道名称=$1;
如果 [ -p $管道名称 ]; 那么
    rm $管道名称;
原名=$2.log
文件名=$2

改名()
{
    newfilename="$origname-`日期+%s`"
    mv $原文件名$新文件名
    nohup nice -n 20 tar -czvf $新文件名.tar.gz $新文件名&
    陷阱重命名 2
}

mkfifo $管道名
陷阱重命名 2

当 [ 1 -当量 1 ]
    读取输入
    echo $输入>>$原名
完成 $pipename

然后我可以按照以下方式启动一个进程:

nohup myprog.py > namedpipe 2>&1 &

启动后,我会设置一个 cron 作业来向其发送轮换信号。

这个脚本是否健壮/高效?

答案1

不。

如果namedpipe已经存在,则打印警告并停止,而不是简单地删除它:使用它的脚本会发生什么?查看现有的脚本/etc/init.d。查看Debian和Ubuntu(或任何Debian衍生发行版)上的start-stop-daemon。

错误消息应该发送到 stderr,而不是 stdout。最后缺少输入重定向。Tar 增加了不必要的开销:只需对文件进行 gzip 压缩即可。

等等。

但无论如何,所有这些都不需要向使用 nohup 启动的脚本添加日志轮换:只需使用copytruncate中的选项logrotate(参见man logrotate);并放弃命名管道解决方案。

相关内容