我正在使用日志轮换来轮换我正在运行的守护进程(Web 服务)的日志。日志轮转如下:
/var/log/deamon/error.log {
daily
rotate 20
compress
delaycompress
missingok
notifempty
create 644 uwsgi uwsgi
postrotate
/etc/init.d/deamon stop
/etc/init.d/deamon start
endscript
}
工作/etc/init.d/deamon stop
正常,但它永远不会开始备份。有两个问题之一:要么我收到权限被拒绝错误(可能不是因为我也会得到它停止)。或者启动部分失败。我需要以 root 身份启动服务,因为出于权限问题我需要设置 UID 和 GID。即使我设置了权限,-rwxrwxrwx
它也会给我这个错误:unable to set gid to 1001 (Operation not permitted)
我的问题是如何将 logrotate 设置为以其他用户(即 root)身份运行或允许旋转来设置 gid。
这是我的/etc/init.d/deamon
#!/bin/bash
daemon=/venv/deamon_django18/bin/uwsgi
pid=/var/run/uwsgi/deamon.pid
args="--ini /etc/uwsgi/deamon.ini --pidfile $pid"
case "$1" in
start)
echo "Starting uwsgi"
start-stop-daemon -u uwsgi -g uwsgi -p $pid --start --exec $daemon -- $args
;;
stop)
echo "Stopping script uwsgi"
start-stop-daemon --signal INT -u uwsgi -g uwsgi -p $pid --stop $daemon -- $args
;;
reload)
echo "Reloading conf"
kill -HUP $(cat $pid)
;;
*)
echo "Usage: /etc/init.d/uwsgi {start|stop|reload}"
exit 1
;;
esac
exit 0
答案1
为了在 logrotate 中使用不同的用户,您可以指定“su”选项:
/home/ubuntu/log/*.log {
su ubuntu ubuntu
rotate 5
daily
compress
missingok
}
答案2
如果有人遇到类似的问题,我已经解决了。事实证明,问题是守护进程关闭得不够快。当start
在 logrotate 文件中调用 时,该程序在技术上仍在运行。我通过在 init.d 文件中添加 sleep 并重新编写 reload 来调用 stop 然后调用 start 来解决它。最终的解决方案如下所示:
...
reload)
/etc/init.d/daemon stop
sleep 2
/etc/init.d/daemon start
;;
*)
...
以及 logrotate:
...
postrotate
/etc/init.d/daemon reload
endscript
...