Jak ustawić zmienną DATE do użycia w dzienniku dla danych wyjściowych crontab?

10

Bawiłem się na różne sposoby z datą

DATE = $(date)

ale to też nie działało

crontab -e

CRONLOG=/tmp/log/crontab.log
DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
* * * * * echo $DATEVAR >> /tmp/log/crontab.log
*/2 * * * * echo "$DATEVAR hello" >> ${CRONLOG}
*/1 * * * * echo 'every minute' >> ${CRONLOG}

to po prostu wyświetla tekst taki, jaki jest ...

Chcę utworzyć wpis dziennika w crontab.log ze znacznikiem czasu dla każdej aktualizacji

Jak mogę to zrobić na CentOS 6?

AKTUALIZACJA

DATEVAR=date +20%y%m%d_%H%M%S
*/1 * * * * /bin/echo [CRON] $($(DATEVAR)) >> /tmp/log/crontab.log

renderowane tylko [CRON] i NIC, kiedy próbowałem =

qodeninja
źródło

Odpowiedzi:

28

Cron nie jest powłoką - nie analizuje poleceń w taki sam sposób, jak robi to powłoka. Jako taka, twoja zmienna jest przypisana tak, jakby to był tekst statyczny.

Istnieją trzy rozwiązania tego problemu:

Opcja 1: Użyj skryptu powłoki, aby wygenerować polecenie, dołącz dowolne zmienne i logikę - i wywołaj ten skrypt powłoki z crona.

* * * * * /path/to/myscript.sh

myscript.sh:

DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
echo $DATEVAR >> /tmp/crontab.log

Opcja 2: dołącz polecenie date bezpośrednio do polecenia, a ponieważ całe polecenie jest przekazywane do powłoki, data zostanie przetworzona i zastąpiona rzeczywistą datą.

* * * * * /bin/echo `date +20\%y\%m\%d_\%H\%M\%S` >> /tmp/crontab.log

Opcja 3: Ustaw zmienną łańcuchową w cron i przekaż ją do polecenia, które ma być przetworzone (uwaga - znaki procentu nie muszą być poprzedzane znakami ucieczki, a sama zmienna jest owinięta w $ (), aby wykonać ją w osobnej powłoce - backticks powinien działać tak samo):

DATEVAR=date +20%y%m%d_%H%M%S
* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

(We wszystkich powyższych przypadkach można oczywiście użyć zmiennej dla ścieżki dziennika zamiast „twardego kodowania”).

cyberx86
źródło
1
dzięki za świetne opinie +1, próbowałem dodać go do crontab, ale robienie tego nie działało = / nigdy nie wyświetla DATEVAR
qodeninja
Właśnie to zrobiłem na systemie kompatybilnym z RHEL / CentOS6 i dało to oczekiwany wynik (tj. Dodałem nową linię do pliku z datą). Którą opcję (z 3 powyżej) wypróbowałeś i jaki był wynik - bądź konkretny - i czy wystąpił błąd w / var / log / cron? (jeśli użyjesz opcji skryptu, a) nie zapomnij o chmod +
xib
1
opcja 3 =], próbowałem to zrobić wcześniej, ale się nie renderowało. Ale teraz zauważam, że zrobiłeś coś małego. dlaczego podwoiłeś $ ($ (DATE))? patrz moja aktualizacja powyżej
qodeninja,
1
W dodanej aktualizacji masz literówkę - tak $($DATEVAR)nie jest $($(DATEVAR)). Pomyśl o tym w ten sposób - $()to znaczy zewnętrznym nawiasie - uruchamia nową powłokę, aby przetwarzać wszystko, co jest w nawiasach. W tym przypadku zmienna $ DATEVAR jest ustawiona na ciąg znaków i przekazywana do powłoki. $(DATEVAR)jest niczym - ponieważ DATEVARjest niczym (tzn. czy brakuje $, aby zidentyfikować go jako zmienną). Możesz również skorzystać z backticksa, $DATEVARaby uzyskać ten sam wynik
cyberx86,
Słusznie. zaktualizowałem to. spróbujmy tego złego chłopca! - Hazaaah! zadziałało lol
qodeninja,