Mam skrypt wdrażania, musi on coś dodać do użytkownika crontab
(uruchomić skrypt, który czyści dzienniki co XXX dni), jednak można to zrobić tylko podczas pierwszego wdrożenia lub gdy trzeba go zaktualizować.
(Mogę biegać xxx.py deploy env
lub xxx.py update env
)
więc muszę to zrobić:
Check if my cronJob already exist
Put my cronJob if it does not already exist
or
update my cronjob if one of the parameter of the command is different
Nie widzę, jak dodać / sprawdzić / usunąć coś crontab
bez użycia crontab -e
lub edycji crontab
pliku (pobierz, przepisz, prześlij ponownie)
PS: jest to cronjob specyficzny dla użytkownika, „webadmin” to zrobi i nie powinien używać do tego sudo.
/etc/cron.d
? Jeśli tak, umieść tam swój skrypt, używając nazwy unikalnej dla Twojej aplikacji/etc/crontab
pliki w/etc/cron.d/
mają dodatkowe pole na nazwę użytkownika, bezpośrednio po specyfikacji harmonogramu. np* * * * * username /path/to/script
. Zobaczman 5 crontab
i wyszukajSYSTEM CRON
.Odpowiedzi:
jak dotąd mój najlepszy pomysł
najpierw sprawdź, czy treść pasuje do tego, co powinno tam być, i zaktualizuj tylko, jeśli nie:
ale komplikuje się to na tyle, aby zbudować osobny skrypt wokół tego zadania crona.
inne pomysły
możesz wysłać ciąg przez stdin do crontab (uwaga, to wyczyści wszystkie poprzednie wpisy crontab):
powinno to nawet działać bezpośrednio przez ssh:
jeśli chcesz dołączyć do pliku, możesz użyć tego:
źródło
echo '*...
rozszerzyłem*
listę plików. 2) zakończenia wierszy w crontab zostały usunięte.echo "*...
i 2) usunięcieecho $
z początku linii.Dla przypomnienia proponuję użyć
/etc/cron.d/
. Tylko root może tutaj zapisywać pliki, ale wpisy można uruchamiać jako dowolny użytkownik (bez potrzebysudo
).Można to zastosować wiele razy, w
webadmin.cron
razie potrzeby aktualizując plik lokalny przed skopiowaniem go.Możesz nawet usunąć obsługę administracyjną:
Zauważ, że w wielu przypadkach nie możesz podać hasła roota dla poleceń
scp
/ssh
. Zamiast tego musisz skonfigurować certyfikaty klucza publicznego / prywatnego. Ponadto, implikacja, konto lokalne (cokolwiek to jest) będzie miało pełny dostęp root do zdalnego serwera. W tej chwili nie jest jasne, czy byłoby to przeszkodą dla konkretnego scenariusza.źródło
/etc/cron.d/
istnieje właśnie w tym celu - aby pakiety / wdrożenia mogły po prostu upuścić tutaj plik crontab.Zdecydowanie zalecam używanie do tego Ansible *, a nie rozwijanie własnego. Lub Puppet lub Chef - ale Ansible doskonale nadaje się do skryptów wdrażania z zerową infrastrukturą, takich jak ten.
Dzieje się tak, ponieważ istnieją już moduły przeznaczone do rozwiązywania takich problemów, a narzędzia do zarządzania konfiguracją mają idempotencję jako podstawowy cel projektowania - właściwość polega na zmianie tylko wtedy, gdy trzeba, nawet jeśli przypadkowo (lub celowo) uruchomisz ją ponownie.
W szczególności moduł cron Ansible może modyfikować pliki crontab użytkownika. Jako bonus, jeśli chcesz później dostosować się do crontabs systemowych, będzie to bardzo łatwa modyfikacja niż przepisywanie.
* wyłączenie odpowiedzialności: Pracuję dla Red Hat, a Ansible to projekt sponsorowany przez Red Hat.
źródło
Jeśli chcesz dodać zadanie cron za pośrednictwem konta docelowego, uruchom
crontab -e
. To polecenie przekazuje crontab przez edytor. Powiedz, aby używał polecenia edytora, które modyfikuje tabelę crontab według własnego uznania. Polecenie edytora jest wykonywane jako fragment powłoki z dołączoną nazwą pliku tymczasowego.Podejście to jest bardziej niezawodne niż natywne,
crontab -l | … | crontab -
ponieważ jest podatne na warunki wyścigu, jeśli crontab jest edytowany jednocześnie: modyfikacje dokonane między wywołaniemcrontab -l
a wezwaniem docrontab -
zostaną cofnięte.źródło
Jest to adaptacja tego, co oferował @ phillip-zyan-k-lee-stockmann , w oparciu o jego kod „Najlepszy pomysł do tej pory”.
Moje zmiany od jego (doskonałego i pomocnego fragmentu) są w zasadzie:
Oto mój kod tego, co nazwałem
crontab-add-hourly.sh
:Przykładowe użycie i dane wyjściowe:
źródło
TL; DR: To faktycznie działa, przetestowane w Bash 4.4.
Jak zauważono w komentarzach @Phillip -Zyan K Lee-Stockmann, rozwiązanie to rozszerza się
*
na wszystkie pliki w bieżącym katalogu. Nie udało mi się uzyskać sugestii komentarzy. zestaw -f wyłącza rozszerzenie symboli wieloznacznych, patrz https://stackoverflow.com/a/11456496/915441 .źródło