我有很多代码需要守护进程,以便打印到标准输出。我正在考虑使用以下 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
);并放弃命名管道解决方案。