Zaczynam skrypt Pythona za pomocą crona, jak poniżej:
#Python script called every 3 minutes in case script crashes
*/3 * * * * /home/ubuntu/python_script.sh &
A mój skrypt ma kilka wydruków do debugowania. Chcę wydrukować te wiadomości w pliku, na przykład /home/ubuntu/Logs.txt
Mój skrypt sprawdza również, czy wywołanie Pythona jest już uruchomione, więc nie można go ponownie uruchomić:
#!/bin/bash
lines=$(ps -ef | grep python_script.py | wc -l)
if [ $lines -ne 2 ]; then
python python_script.py &
fi
Jak wydrukować moje wiadomości do tego pliku? Używam Pythona 2.7
Aktualizacja: Edytowałem mój kod w następujący sposób:
1) Dodano to jako pierwszy wiersz mojego skryptu python:
from __future__ import print_function
2) Otworzyłem plik dziennika po ostatnim imporcie, a zaraz potem dodałem wydruk testowy:
log = open("/home/ubuntu/Logs.txt", "w+")
print("Testing...", file = log)
Jeśli po prostu uruchomię go z terminala, zostanie wydrukowany do pliku w porządku. Ale jeśli zaplanuję to z cronem, nie zapisuje do pliku.
Aktualizacja 2: Ostatecznie natknąłem się na rozwiązanie za pomocą polecenia „logger”. W moim skrypcie powłoki musiałem dodać „2> i 1” (w skrypcie powłoki, a nie crontab, jak opisał ElmoVanKielmo) i „| logger &”. Ostateczne rozwiązanie wygląda następująco:
#!/bin/bash
lines=$(ps -ef | grep python_script.py | wc -l)
if [ $lines -ne 2 ]; then
python python_script.py 2>&1 | logger &
fi
i wypisuje wszelkie odbitki do pliku / var / log / syslog, co jest dla mnie wystarczająco dobre.
Odpowiedzi:
12 dla odpowiedzi № 1W swoim crontabie umieść to:
*/3 * * * * /home/ubuntu/my_script.sh >> /home/ubuntu/Logs.txt
Przekieruje standardowe wyjście do tego pliku.
Możesz również chcieć przekierować stderr (wyjątki itp.), Więc:
*/3 * * * * /home/ubuntu/my_script.sh >> /home/ubuntu/Logs.txt 2>> /home/ubuntu/errors.txt
Lub możesz mieć je wszystkie w jednym pliku:
*/3 * * * * /home/ubuntu/my_script.sh >> /home/ubuntu/Logs.txt 2>&1