Czy mogę powiedzieć:
MYPATH=/root/scripts
MYSCRIPT=doit.sh
0 1 * * * $MYPATH/$MYSCRIPT
w crontab -e
?
Czy można używać zmiennych w crontab -e
?
Czy mogę powiedzieć:
MYPATH=/root/scripts
MYSCRIPT=doit.sh
0 1 * * * $MYPATH/$MYSCRIPT
w crontab -e
?
Czy można używać zmiennych w crontab -e
?
Odpowiedzi:
Tak, możesz zdefiniować i używać zmiennych w ten sposób. Istnieje ograniczenie (którego nie trafiłeś w swoich przykładach): ciąg po prawej stronie =
znaku jest interpretowany dosłownie, z usuniętymi spacjami wiodącymi, więc nie możesz używać konstrukcji takich jak FOO=$BAR/qux
(np. PATH=$HOME/bin:$PATH
Nie zrobi nic użytecznego).
Jest to określone w dokumentacji, którą można zobaczyć po uruchomieniu
man 5 crontab
(Zauważ, że man crontab
pokazuje dokumentację crontab
polecenia , w sekcji 1 instrukcji; potrzebujesz dokumentacji crontab
formatu pliku , w sekcji 5.)
Właśnie spróbowałem, tak, jest to możliwe. Możesz to zrozumieć za pomocą tego prostego przykładu, umieść to w crontab
:
FOO = qwerty * * * * * echo $ FOO> ~ / out
I sprawdź plik ~/out
(aktualizowany co minutę), powinien on zawierać "qwerty"
.
Podczas gdy crontabs Linuksa obsługują definiowanie niektórych zmiennych, które przechowują wartości dosłowne, nie ma to większego zastosowania poza zagęszczaniem długiego tekstu do krótszej reprezentacji lub kontrolowaniem niektórych rzeczy dotyczących samego crona, takich jak gdzie wysyłać dane wyjściowe e-mailem.
Elastyczność polega na zrozumieniu, że część komendowa wpisu cron zostanie przekazana /bin/sh -c
lub zdefiniowana powłoka SHELL
w systemach korzystających z Vixie cron (ta zwykle instalowana w systemach Linux). Oznacza to, że pozostała część wiersza poleceń to prosty skrypt powłoki. UWAGA: uświadom sobie, z jakiej powłoki korzystasz. W Linuksie /bin/sh
jest normalnie, /bin/bash
więc $( ... )
wbudowane polecenie działa, ale nie działałoby na starszych systemach, w których /bin/sh
tylko rozumie `
.
Na przykład mam prostą linię crontab, która co miesiąc archiwizuje plik MBX zapisanych wiadomości i kompresuje go. To wygląda tak:
15 0 1 * * nf=MailFeed-$( date +\%Y\%m ).mbx && cd Logs && mv MailFeed.mbx $nf && bzip2 -9 $nf
Spowoduje to uruchomienie pierwszego każdego miesiąca o godzinie 12:15, ustawienie nowej nazwy pliku z CCYYMM, przeniesienie bieżącego pliku do nowej nazwy i skompresowanie go. Należy pamiętać, że nieskalowany %
(znak procentu) będzie traktowany jako nowy wiersz, a dane po nim będą wysyłane jako standardowe do polecenia poprzedzającego znak procentu. Dlatego normalna date +Y+m
jest napisana jak date +\%Y\%m
wyżej.
Nie, cronjob może zawierać tylko przedmioty cron. Czy nie jest możliwe utworzenie skryptu bash i uruchomienie skryptu bash poprzez cronjob?