Dlaczego mój cron.d na minutę nie jest uruchamiany?

33

Rzuciłem kilka rzutek, próbując uzyskać mój skrypt w języku Python, który będzie wykonywany co minutę. Pomyślałem więc, że uprościłem to, wykonując „najprostszą rzecz, która mogłaby ewentualnie działać” raz na minutę (uruchamiam debian / testowanie).

Utworzyłem plik jednowierszowy w /etc/cron.d/perminute:

* * * * * /bin/touch /home/me/ding_dong

Jest własnością roota i jest wykonywalny (nie jestem pewien, czy którykolwiek z nich ma znaczenie). A potem zrobiłem:

sudo service cron reload

A potem usiądź i zacznij biegać od ls -ltrnowa w moim katalogu domowym ( /home/me). Ale mój plik ding_dong nigdy się nie pojawia. Wiem, że jeśli to zrobię sudo /bin/touch /home/me/ding_dong, od razu się pojawi.

Oczywiście brakuje tu czegoś głupiego.

Travis Griggs
źródło
3
Ponowne ładowanie usługi demona cron w celu zastosowania zmiany w cron.d jest zwykle niepotrzebne, ponieważ i tak co minutę skanuje katalog w poszukiwaniu nowych i zaktualizowanych plików.
Josip Rodin

Odpowiedzi:

45

Dodając konfigurację crona do /etc/cron.d/lub /etc/crontabwewnątrz, musisz dodać nazwę użytkownika, w którym kontekście polecenie powinno zostać uruchomione, w twoim przykładzie

* * * * * root /bin/touch /home/me/ding_dong

I tylko wskazówka ode mnie: nie musisz zaczynać od ls -ltrnowa, po prostu użyj watch -n 5 "ls -ltr"i uruchomi polecenie co 5 sekund (lub dowolną inną wartość, zastępując 5 tym, czego chcesz).

noggerl
źródło
9
To mnie poprowadziło we właściwym kierunku. To był moment na zawrót głowy. Naprawiłem to, a jednak nadal nie działało. Po przeczytaniu man crontrochę wolniej i zwróceniu szczególnej uwagi na DEBIAN specificsekcje zauważyłem, że pliki NIE mogą być grupowe ani inne do zapisu. Który w pewnym momencie włączyłem w swoją frustrację.
Travis Griggs,
Czy nie możesz po prostu zmienić właściciela skryptu na root?
Geremia
Ta konkretna linia pomogła mi. Od man cron: Dodatkowo w Debianie cron odczytuje pliki z katalogu /etc/cron.d. cron traktuje pliki w /etc/cron.d tak samo, jak plik / etc / crontab (zachowują specjalny format tego pliku, tzn . zawierają pole użytkownika ). Są one jednak niezależne od / etc / crontab: na przykład nie dziedziczą po nim ustawień zmiennych środowiskowych. Ta zmiana jest specyficzna dla Debiana, patrz uwaga poniżej DEBIAN SPECIFIC.
harperville
man 8 cron (w Debianie) mówi również, że pliki w /etc/cron.d/ mogą zawierać tylko znaki alfanumeryczne, „-” i „_”. W szczególności brak kropek.
mpartel
3

Aby utworzyć nowe cronzadanie, uruchom je crontab -ejako użytkownik, którego chcesz uruchomić. Następnie dodaj odpowiedni wiersz w oknie edytora, które się pojawi:

* * * * * /bin/touch /home/me/ding_dong

Sposób, w jaki to robisz, wymaga innego formatu i tak naprawdę nie jest dobrym pomysłem. Crontabs /etc/cron.dmają nieco inny format, wymagają uruchomienia nazwy użytkownika. Na przykład:

* * * * * USERNAME /bin/touch /home/me/ding_dong

Dobrą sztuczką (jak sugeruje @VogonPoetLaureate) jest wychwycenie standardowego błędu zadań cron, który może pomóc w ich debugowaniu. Na przykład:

* * * * * /bin/touch /home/me/ding_dong 2>/tmp/error
terdon
źródło
6
Nie ma absolutnie żadnego powodu, aby twierdzić, że cron.d „nie jest dobrym pomysłem”. Demon cron prześle wyjście cron.d stderr do nazwy użytkownika, a jeśli chcesz przekierować go na inny adres e-mail, dostępna jest zmienna MAILTO.
Josip Rodin
@JosipRodin nie jest dobrym pomysłem na rzeczy, które nie są uruchamiane przez root i które są skonfigurowane przez ciebie. Ma to sens dla sysadmina w systemie wieloużytkownikowym, ale na własnej maszynie, łatwiej jest mieć wszystko we własnym crontabie, więc jest tylko jedno miejsce do sprawdzenia i crontab -lwyszczególnienia wszystkich twoich zadań cron.
terdon
Zakłada się, że tak naprawdę jest to tylko osobiste zadanie cron, czego OP tak naprawdę nie wyjaśnił - na ogół istnieje wiele aplikacji dla nieuprzywilejowanych zadań cron użytkownika konfigurowanych za pośrednictwem cron.d, takich jak trzymanie ich wszystkich w jednym miejscu, pomimo faktu, że masz ładnie sekwestrowani użytkownicy usług, automatyczne wdrażanie jest łatwiejsze itp.
Josip Rodin
@JipipRodin absolutnie. Przyjąłem system osobisty, ponieważ i) systemy korporacyjne są tutaj nie na temat i ii) pytanie sugerowało, że użytkownik nie jest ekspertem.
terdon
OK, chyba już tego nie czytałem ze względu na powszechne zamieszanie między superużytkownikiem a awarią serwera i stronami unix SE :)
Josip Rodin
2

Możliwym błędem jest tutaj to, jak tworzony jest plik jednowierszowy . Z dokumentacji Ubuntu :

... linia ma pięć pól daty i godziny, po których następuje polecenie, a po nim znak nowej linii .

Na przykład ten sposób tworzenia nie działa:

printf "* * * * * /bin/touch /home/me/ding_dong" > /etc/cron.d/ding_dong
okoloBasii
źródło