Codzienne zadanie cron nie działa

10

Krótki przegląd: Mam skrypt, który codziennie tworzy kopię zapasową mojego repozytorium kodu źródłowego z SVN w archiwum na ten dzień. Przetestowałem skrypt i działa bardzo dobrze, o ile uruchamiam go jako sudo, z powodu własności katalogu wyjściowego.

Problem polega na tym, że chcę uruchamiać to codziennie, więc umieściłem link do niego w katalogu /etc/cron.daily. Oto zawartość katalogu.

thom@spenser:/etc/cron.daily$ ls -l
total 60
-rwxr-xr-x 1 root root   189 2011-09-14 02:21 apport
-rwxr-xr-x 1 root root 15535 2011-10-06 11:30 apt
-rwxr-xr-x 1 root root   314 2011-08-08 16:57 aptitude
lrwxrwxrwx 1 root root    24 2012-02-28 11:05 backup -> /usr/local/bin/backup.sh
-rwxr-xr-x 1 root root   502 2011-06-08 11:48 bsdmainutils
-rwxr-xr-x 1 root root   256 2011-10-06 04:04 dpkg
-rwxr-xr-x 1 root root   372 2011-10-04 16:50 logrotate
-rwxr-xr-x 1 root root  1353 2011-07-27 07:17 man-db
-rwxr-xr-x 1 root root   606 2011-08-17 09:16 mlocate
-rwxr-xr-x 1 root root   249 2011-06-24 05:36 passwd
-rwxr-xr-x 1 root root  2417 2011-07-01 17:25 popularity-contest
-rwxr-xr-x 1 root root   383 2011-09-30 15:09 samba
-rwxr-xr-x 1 root root  3594 2011-09-19 20:07 standard
thom@spenser:/etc/cron.daily$ 

Problem polega na tym, że po prostu nigdy nie działa. Oto uprawnienia dla tego skryptu:

thom@spenser:/etc/cron.daily$ ls -l /usr/local/bin/backup.sh 
-rwxr-xr-x 1 root root 260 2012-02-28 11:03 /usr/local/bin/backup.sh

Pomysły?

Thom
źródło
2
Jeśli to możliwe, rozważ zamknięcie niektórych z pozostałych otwartych pytań, wybierając najlepszą odpowiedź (jeśli mają one). Potrzebujemy użytkowników do zadawania pytań, aby strona mogła być skutecznym narzędziem dla następnej osoby z Twoimi problemami. Aby uzyskać więcej informacji na temat najlepszych praktyk, przeczytaj artykuł FAQ na temat zadawania pytań .
Bruno Pereira,

Odpowiedzi:

37

Próbowałem tego

run-parts --test /etc/cron.daily

Odkryłem, że mój plik update.ubuntu nie pojawił się. Zauważyłem również, że mój plik ma rozszerzenie (ma w nim kropkę).

Kroki, aby to naprawić.

  1. Nazwa mojego update.ubuntu została zmieniona na update-ubuntu
  2. Teraz znowu run-parts --test /etc/cron.dailytym razem pojawiła się moja teczka!
D Durga Prasad
źródło
1
Tak, naprawiłem to. Nie lubi kropek w nazwie pliku, zmiana nazwy mojego pliku z myscript.sh na myscript działała dla mnie.
Matt Parkins,
3
To musi być wyższe. Skrypt zapisałem jako tradycyjny plik „backup.sh”. Usunięcie części „.sh” rozwiązało to. Wielkie dzięki!
David
Dzięki! Facet / gal, który postanowił w sposób dorozumiany usunąć pliki .sh z codziennego crona, powinien się wstydzić!
Sylvain
Powinny być publicznie wychłostane! ;-) Zastanawiam się, ile czasu ludzie wspólnie stracili z powodu tej decyzji ... Zastanawiam się także, czy był to dobry powód?
xastor
3

Może to być jedna z kilku rzeczy:

Ścieżka rootowania:

W zależności od uruchamianych poleceń może być konieczne rozwinięcie zmiennej PATH użytkownika root, umieszczając następujący wiersz u góry pliku crontab:

ŚCIEŻKA = / usr / sbin: / usr / bin: / sbin: / bin

src: https://help.ubuntu.com/community/CronHowto

Lub po prostu użyj pełnych ścieżek do każdego polecenia w skrypcie: /bin/lszamiast lsna przykład. ( which lsw linii poleceń dla ścieżek).

Zgłoszono tutaj dziwny błąd dotyczący kropek w nazwie pliku . Może rozciągać się na plik, który łączysz, choć wydaje się to mało prawdopodobne.

Czy zapisujesz dane wyjściowe z pliku kopii zapasowej? Umieść coś takiego w pierwszym wierszu, aby ustalić, czy w ogóle nie działa, czy działa, ale w pewnym momencie ulega awarii.

/bin/echo "Attempting to run backup" >> /path-to-home/backup.log

Alternatywnie spróbuj dodać skrypt bezpośrednio do pliku crontab:

sudo -i
crontab -e
[add the next line to the file, then save and exit]
33 15 * * * /usr/local/bin/backup.sh

będzie działać o 15:30 każdego dnia, jeśli maszyna jest włączona. użyj * * * * * podczas testowania, aby uruchamiać się raz na minutę, aż zacznie działać.

Sean
źródło
1
Używanie bezwzględnych ścieżek w skryptach jest odradzane. Jeśli nie wiesz, czym jest ŚCIEŻKA, ustaw ją samodzielnie w skrypcie. Zobacz powody, dla których crontab nie działa
geirha
Przydatny link, dzięki. Podanym powodem nieużywania pełnych ścieżek jest przenośność. Słusznie. Innym rozsądnym rozwiązaniem jest zdefiniowanie poleceń używanych na początku skryptu wraz z innymi konfiguracjami: LS = / bin / ls; SRC_DIR = / home / joe / src. Następnie użyj $ LS $ SRC_DIR. Utrzymuje wszystko zdefiniowane na górze i w jednym miejscu.
Sean
Uważam, że aby zmniejszyć czytelność, musisz przejrzeć każde polecenie COMMAND = / path / to / dla każdego nowego systemu, na którym powinien on działać. W jednym systemie wszystkie potrzebne polecenia mogą znajdować się w / usr / bin, w innym niektóre są w / bin, inne w / usr / bin. Sam fakt posiadania zarówno / usr / bin i / bin w PATH sprawia, że ​​nie jest to problem. Na marginesie, nazwy zmiennych powinny być pisane małymi literami, w przeciwnym razie istnieje ryzyko zastąpienia specjalnych zmiennych powłoki lub zmiennych środowiskowych.
geirha
re: nazwy zmiennych wielkich liter. Zawsze robiłem to bez zastanowienia, z powodu pierwszych skryptów, które widziałem. Ale masz rację, nie ma plusów i szansy na minus. Dzięki za zwrócenie na to uwagi i zerwanie tego nawyku teraz.
Sean
1

Grep syslog dla wiadomości takich jak;

crond: (*system*) BAD FILE MODE

pliki muszą być ograniczone do (wystarczające) w 644):

chmod 0644 /etc/cron.d/my_crontab
Tom H.
źródło