Błąd logrotate nginx w zadaniu cron

10

Używam Ubuntu 14.04 LTS i nginx na Digital Ocean VPS i od czasu do czasu otrzymuję te e-maile o nieudanym zadaniu cron:

Przedmiot

Test Cron -x / usr / sbin / anacron || (cd / && run-parts --report /etc/cron.daily)

Treść e-maila to:

/etc/cron.daily/logrotate: błąd: błąd podczas uruchamiania udostępnionego skryptu postrotate dla części wykonawczych „/var/log/nginx/*.log”: /etc/cron.daily/logrotate zakończony kodem powrotu 1

Wszelkie przemyślenia na temat tego, jak to rozwiązać?

Aktualizacja:

/var/log/nginx/*.log {
  weekly
  missingok 
  rotate 52 
  compress 
  delaycompress
  notifempty 
  create 0640 www-data adm
  sharedscripts
  prerotate
      if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
          run-parts /etc/logrotate.d/httpd-prerotate; \
      fi
  endscript 
  postrotate 
      invoke-rc.d nginx rotate >/dev/null 2>&1
  endscript 
}

Aktualizacja:

$ sudo invoke-rc.d nginx rotate
initctl: invalid command: rotate
Try `initctl --help' for more information.
Chris
źródło
wygląda na to, że nie może uruchomić tego, co jest określone jako akcja postrotate, pokaż nam swój /etc/logrotate.d/nginixskrypt
X Tian
/var/log/nginx/*.log {cotygodniowe brakowanieokręć 52 kompresuj delaycompress notifempty utwórz 0640 www-data adm skrypty współdzielone prerotate jeśli [-d /etc/logrotate.d/httpd-prerotate]; następnie \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi \ endcript postrotate invoke-rc.d nginx rotate> / dev / null 2> & 1 endcript}
Chris
1
To normalne, że aktualizujesz pytanie o dodatkowe informacje na żądanie. 4 spacje na początku każdej linii to blok kodu.
X Tian
Więc invoke-rc.d nginx rotatezawiedzie, spróbuj uruchomić go jako odpowiedni użytkownik i pokaż nam również ten skrypt, wklej dane wyjściowe do pierwotnego pytania. tks.
X Tian
Próbowałem uruchomić, otrzymałem nieprawidłowy błąd polecenia.
Chris

Odpowiedzi:

10

Działanie po obróceniu wydaje się nieprawidłowe

Próbować

invoke-rc.d nginx reload >/dev/null 2>&1

Jeśli spojrzysz na nginxpolecenie, zobaczysz działania, które zaakceptuje. Również otrzymana wiadomość mówi „sprawdź”initctl --help

xtian@fujiu1404:~/tmp$ initctl help
Job commands:
  start                       Start job.
  stop                        Stop job.
  restart                     Restart job.
  reload                      Send HUP signal to job.
  status                      Query status of job.
  list                        List known jobs.

więc przeładowanie powinno działać i wysyłać sygnał HUP do nginx, aby wymusić ponowne otwarcie plików dziennika.

X Tian
źródło
Dziękujemy, to polecenie wydaje się działać bezbłędnie. Zaktualizuję zadanie crona i zaczniemy od tego miejsca.
Chris
4

Jak wspomniano w innej odpowiedzi, problem polega na tym, że invoke-rc.d nginx rotatezwraca błąd informujący, że rotatedziałanie nie jest obsługiwane. Ciekawe jest to, że service nginx rotatedziała bez problemów.

Domyślam się, że invoke-rc.dopakowanie nie obsługuje wszystkich działań obsługiwanych przez rzeczywisty skrypt inicjujący nginx.

Zmiana invoke-rc.d nginx rotatena service nginx rotatepowinna rozwiązać problem.

Robin Smidsrød
źródło
3

Nie jestem pewien, czy to dlatego, że initctldawka nie obsługuje tej rotateopcji, a kiedy została usunięta, ale nie jesteś jedynym, którego to dotyczy, i jest otwarty raport o błędzie na starterze.

Jak wspomniano w innych odpowiedziach powyżej i poniżej, możesz edytować plik logrotate nignx i zastąpić linię problmatic

invoke-rc.d nginx reload >/dev/null 2>&1

z innymi alternatywami, które działają,

start-stop-daemon --stop --signal USR1 --quiet --pidfile /run/nginx.pid --name nginx
# or 
service nginx rotate >/dev/null 2>&1
# or
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`

Jakąkolwiek metodę wybrałeś, nie zmieniaj pliku zarządzanego przez pakiet, a po zmianie nie będzie on już aktualizowany i będziesz musiał ręcznie rozwiązać różnicę lub zastąpić ją nowy (który wszystkie gotowe zawierają poprawkę).

Rabin
źródło
Nie jestem pewien, czy w tym przypadku obowiązuje błąd „polecenia serwisowe nie działają”, ponieważ w każdym błędzie występują różne problemy. (Ciekawostka: mam poprawkę w pracach dla 1450770)
Thomas Ward
1

Pracował dla mnie:
Zastępuje
postrotate invoke-rc.d nginx rotate >/dev/null 2>&1
Z
postrotate service nginx rotate >/dev/null 2>&1

Jadeye
źródło
0

Zastąpić:

invoke-rc.d nginx reload >/dev/null 2>&1

Z:

[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`

wydaje się, że w nowszych wersjach Nginx to działa. Używam wersji 1.9.

bonitarunner
źródło