Czy można używać zmiennych w crontab -e?

13

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?

użytkownik19496
źródło

Odpowiedzi:

15

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:$PATHNie zrobi nic użytecznego).

Jest to określone w dokumentacji, którą można zobaczyć po uruchomieniu

man 5 crontab

(Zauważ, że man crontabpokazuje dokumentację crontab polecenia , w sekcji 1 instrukcji; potrzebujesz dokumentacji crontab formatu pliku , w sekcji 5.)

Gilles „SO- przestań być zły”
źródło
7

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".

Cyrus
źródło
2
+1 do pokazania, w jaki sposób OP może samodzielnie znaleźć podobne rzeczy.
Arthaey,
Lepszym przykładem będzie użycie $ FOO w skrypcie docelowym.
Acumenus
4

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 -club zdefiniowana powłoka SHELLw 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/shjest normalnie, /bin/bashwięc $( ... )wbudowane polecenie działa, ale nie działałoby na starszych systemach, w których /bin/shtylko 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+mjest napisana jak date +\%Y\%mwyżej.

D francuski
źródło
-2

Nie, cronjob może zawierać tylko przedmioty cron. Czy nie jest możliwe utworzenie skryptu bash i uruchomienie skryptu bash poprzez cronjob?

Maran
źródło
1
Prawda w niektórych innych jednostkach, ale cron Linuksa obsługuje przypisywanie zmiennych środowiskowych.
Gilles „SO- przestań być zły”