특정 사용자로 logrotate 실행

특정 사용자로 logrotate 실행

나는 실행 중인 데몬(웹 서비스)의 로그를 회전하기 위해 로그 회전을 사용하고 있습니다. 로그 회전은 다음과 같습니다.

/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하지만 백업이 시작되지 않습니다. 두 가지 문제 중 하나가 있습니다. 권한 거부 오류가 발생합니다(아마도 중지했기 때문에 발생하지 않았을 것입니다). 또는 시작 부분이 실패합니다. 권한 문제로 UID, GID를 설정해야 해서 루트로 서비스를 시작해야 합니다. 권한을 설정하더라도 -rwxrwxrwx다음 오류가 발생합니다. unable to set gid to 1001 (Operation not permitted)제 질문은 logrotate를 다른 사용자(예: 루트)로 실행하도록 설정하거나 회전을 허용하여 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

비슷한 문제가 있는 사람이 있으면 해결했습니다. 문제는 데몬이 충분히 빨리 종료되지 않았다는 것입니다. startlogrotate 파일에서 호출 되면 프로그램은 기술적으로 여전히 실행 중입니다. init.d 파일에 sleep을 추가하고 reload를 다시 작성하여 stop을 호출한 다음 start를 호출하여 문제를 해결했습니다. 최종 솔루션은 다음과 같습니다.

...
reload)
    /etc/init.d/daemon stop
    sleep 2
    /etc/init.d/daemon start
    ;;
*)
...

그리고 로그회전:

...
postrotate
    /etc/init.d/daemon reload
endscript
...

관련 정보