以特定用户身份运行 logrotate

以特定用户身份运行 logrotate

我正在使用日志轮换来轮换我正在运行的守护进程(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
...

相关内容