UWAGA : Przeczytałem wszystkie podobne pytania dotyczące. cron, ścieżki, zmienne env i tak dalej, ale nie znalazłem żadnej, która oferowałaby rozwiązania mojego konkretnego problemu.
Mam skrypt, który wykonuje zrzuty MySQL, a następnie usuwa stare:
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete
( powyższe polecenie zostało zmodyfikowane z mojego oryginalnego polecenia dzięki sugestiom z komentarzy )
Jednak pliki nigdy nie są usuwane, gdy cron uruchamia ten skrypt. Użytkownik cron jest rootem.
Debugowanie notatek
Jeśli ręcznie uruchomię skrypt, w którym pojawia się polecenie, usuwa je zgodnie z oczekiwaniami.
Jeśli uruchomię powyższe polecenie find samodzielnie z wiersza poleceń jako root, usuwa je zgodnie z oczekiwaniami (i przy pomocy -print zwraca listę plików starszych niż 5 dni zgodnie z oczekiwaniami)
Dodałem także wyraźną instrukcję path do crontab root'a, ale
to nic nie zmienia.Cron nie wysyła żadnego błędu, a jeśli potokuję operację znajdowania do pliku dziennika,
który pojawia się pusty lub wcale nie jest tworzony.Używam serwera Ubuntu 14.04.03 LTS.
/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
cron
polecenia są uruchamiane przez powłokę, a powłoka rozwija symbole wieloznaczne.cron
powinien wysłać wiadomość e-mail z komunikatami wyjściowymi i błędami. Czy otrzymujesz taki e-mail z tej pracy?Odpowiedzi:
Problem polega na tym,
crontab
że nie został$PATH
ustawiony podczas działania. Możesz podać ścieżkę, dodając ją do górnej części pliku otwartego za pomocącrontab -e
:(lub cokolwiek
PATH
, czego wolisz użyć). Oznacza to, że możesz uniknąć podania pełnych ścieżek do poleceń bezpośrednio z crona.Istnieje wiele problemów z oryginalnym poleceniem. Zasadniczo prosisz powłokę o rozwinięcie znaku zastępczego zamiast
find
. Po drugie, nie zapewniasz pełnej ścieżkirm
; użyj/bin/rm
lub/usr/bin/rm
, gdziekolwiek się znajduje w twoim systemie (patrzwhich rm
).Pierwszym argumentem dla find jest „lokalizacja do wyszukiwania”, a następnie określ „zapytanie wyszukiwania” za pomocą różnych
-<option>
s. Właściwy format polecenia, które chcesz uruchomić, to:lub
Jeśli nie określisz powyższej
PATH
definicji, użyj:lub
źródło
$PATH
ustawiony, ale będzie to domyślny system. Będzie to obejmowało/usr/bin
i/bin
dlatego powinno być w stanie znaleźćrm
polecenie.Spróbuj tego zamiast tego
źródło
-maxdepth 1
.Jeśli wywołam polecenie find bezpośrednio z crontab roota, a nie jako część skryptu, to zadziała.
Skrypt, o którym mowa, używa csh. Wierzę, że środowisko crona root na Ubuntu będzie używać / bin / bash (lub / bin / dash?). Być może jest to w jakiś sposób sprzeczne z działaniem polecenia find.
Tak czy inaczej, główny problem został rozwiązany, choć nieco nieelegancko.
źródło