2012-09-21 14 views
14

Mój skrypt python nie działa pod moim crontab.Crontab nie działa mój skrypt python

umieściłem to w skrypcie Pythona na górze:
#!/usr/bin/python

Próbowałem w ten sposób:
chmod a+x myscript.py

Dodano do mojego crontab -e:


    SHELL=/bin/bash 
    PATH=/sbin:/bin:/usr/sbin:/usr/bin 
    MAILTO=""

* * * * * /home/me/project/myscript.py 

Mój plik/var/log/cron mówi:
Sep 21 11:53:02 163-dhcp /USR/SBIN/CROND[2489]: (me) CMD (/home/me/project/myscript.py)

Ale mój skrypt nie działa, ponieważ po sprawdzeniu bazy danych sql nic się nie zmieniło. Gdybym go uruchomić bezpośrednio w terminalu tak:

python /home/me/project/myscript.py

uzyskać poprawny wynik.

To myscript.py:

#!/usr/bin/python 

import sqlite3 

def main(): 
    con = sqlite3.connect("test.db") 

    with con: 

     cur = con.cursor() 

     cur.execute("CREATE TABLE IF NOT EXISTS testtable(Id INTEGER PRIMARY KEY, Name TEXT)") 

     cur.execute("INSERT INTO testtable(Name) VALUES ('BoB')") 

     cur.execute("SELECT * FROM testtable") 

     print cur.fetchall() 


if __name__ == "__main__": 
    main() 

EDIT: za komentarze: Tak, /usr/bin/python istnieje. Mogę również uruchomić skrypt Pythona bezpośrednio przy użyciu tylko /home/me/project/myscript.py. /usr/bin/python /home/me/project/myscript.py działa. Więc nie sądzę, że to jest powód?

+0

co w scenariuszu? Czy to zależy od środowiska? – tMC

+0

Tak, myślę, że musimy zobaczyć wewnątrz twojego myscript.py –

+2

Ustaw zmienną MAILTO na swoją nazwę użytkownika. Wtedy otrzymasz wiadomość o błędzie, która może stanowić wskazówkę. – unutbu

Odpowiedz

11

Co się dzieje, gdy wpiszesz

/home/me/project/myscript.py do muszli?

Czy można jawnie użyć /usr/bin/python w komendzie crontbb?

Czy możesz użyć bezwzględnej ścieżki do swojego test.db lub cd do właściwego katalogu, a następnie wykonać skrypt Pythona?

Jest to pomocne, aby mieć instrukcje debugowania w python i logować niektóre dane. Crontab może być bardzo trudny do debugowania.

+0

Haha, zrobiłeś to! Zmieniłem plik test.db, aby używał bezwzględnej ścieżki '/ home/me/project/test.db' ... I to działa! – user1636922

9

Możliwe, że skrypt nie zostanie uruchomiony, ponieważ nie może zlokalizować interpretera pythonów. Środowisko Crontab może bardzo różnić się od środowiska powłoki, z którego korzystasz. Ścieżki wyszukiwania mogą się znacznie różnić. Testujemy również skrypt, uruchamiając interpreter python jawnie, podczas gdy crontab oczekuje tylko uruchomienia skryptu. Umieszczam ten wiersz na górze moich skryptów pythonowych: #!/Bin/env python. Linia ta pomoże zlokalizować interpreter niezależnie od tego, w którym katalogu jest on zainstalowany, pod warunkiem, że znajduje się on w ścieżce wyszukiwania.

+0

Jestem obecnie w bashu i dodałem Twoją sugestię '#!/Bin/env python'. To nie działa, jak się wydaje. – user1636922

+0

Najpierw sprawdź, czy masz/bin/env lub czy env znajduje się w innym katalogu. – shargors

+23

Uruchom następującą komendę, aby mieć to samo środowisko, co używane przez crontab: env -i/bin/bash --noprofile --norc Następnie uruchom skrypt Pythona i zobacz, dlaczego nie działa. To powinno dać ci pomysł. – shargors

1

Spróbuj umieścić w crontab:

* * * * * python /path/to/your/script.py 

zamiast

* * * * * /path/to/your/script.py 

Również linia shebang jest #!/usr/bin/env python w niektórych środowiskach.env to plik wykonywalny i musisz wiedzieć, gdzie on mieszka z "$ which env".

0
  • Czy użytkownik cron (gdzie skrypt się zawiesza) i użytkownik terminala (gdy skrypt się powiedzie) są tacy sami?
  • Czy możesz przekierować dane wyjściowe zadania do pliku określonego w Cron Job Log - How to Log?. Mogliśmy zobaczyć, czy to pomaga.
0

Podczas gdy odpowiedzi tutaj wyraźnie określają problem i rozwiązanie, chciałem dodać kolejną odpowiedź, która mi pomogła.

Jeśli twój skrypt python wywołuje bazę danych, upewnij się, że możesz poprawnie połączyć się z db w obrębie cron env (w celu zidentyfikowania cron env ->https://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work). Miałem plik uruchamiany z powłoki, ale nie jako crontab, chyba że połączyłem się z bazą danych jako root z poziomu skryptu Pythona.

1

Zwykle problemy z tablicą crontab, takie jak ta, są spowodowane tym, że zmienna środowiskowa PATH jest bardziej restrykcyjna/inna niż w środowisku PATH normalnego użytkownika. Ponieważ twoja powłoka używa środowiska PATH do znalezienia pliku wykonywalnego (np./Usr/bin/python znajduje się w/usr/bin podczas wpisywania "python" w wierszu powłoki), gdy PATH brakuje wspólnych lokalizacji, takich jak/usr/bin lub/usr/sbin, twoja praca cron zawiedzie. To mnie ugryzło wiele razy. Prosta poprawka polega tylko na jawnym ustawieniu ścieżki PATH w górnej części pliku crontab, przed wszystkimi komendami, które jej potrzebują. Więc, po prostu zmodyfikować crontab jak zwykle i dodać coś takiego u góry (jeśli nie jest binarny w jednym z poniższych ścieżek, musisz dodać go po dwukropku):

PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin 
2

I” d ma ten sam problem. Pomimo tego, że skrypt wykonywany ręcznie działał, w crontabie żadna z wymienionych opcji w ogóle nie działała. Przenieśliłem swój skrypt z katalogu/home/user/script_directory/to/opt/scripts/i zaczęło działać. Prawdopodobną przyczyną problemu powinny być prawa dostępu (odczyt) do podfolderów znajdujących się w katalogu domowym.

0

Czasami mam ten sam problem. Niezależnie od tego, co spróbuję, jak tutaj zalecono, może nie dojść do skutku.

Więc zacznę pisać "wyzwalania" skrypt bash następująco (nazwijmy go trigger.sh):

#!/bin/bash 

/full_path/python_script.py 

I wzywam trigger.sh z crontab i wszystko jest w porządku.

EDIT: Oczywiście, nie zapomnij zrobić następujące (podać wykonanie prawej):

$chmod +x python_script.py 
$chmod +x trigger.sh 
0

Najprostszym sposobem obsługi to jest dodać ścieżkę instalacji Pythona do PATH w górnej części skryptu powłoki. Coś jak:

#!/usr/bin/env bash 
export PATH="{path to your python installation}:$PATH" 
python {python_file_name}.py 

Jako @Shargors powiedział, że może go przetestować

env -i /bin/bash --noprofile --norc 
0

Istnieje wiele pół odpowiedzi w internecie, więc pomyślałem, żeby uchwycić to, aby uratować komuś jakiś czas .

Po pierwsze, cronjob ma słabą pracę z informacją, gdzie to się nie udaje.Polecam wysyłanie wyjście stderr do pliku dziennika tak:

Crontab Command:

# m h dom mon dow command 
* * * * * /path/to/your_file.sh >> out.txt 2>&1 

Jak to prawdopodobne, uruchamiając komendę jako użytkownik, sprawdź katalog domowy dla pliku dziennika. Uwaga: ten skrypt działa co minutę, co jest dobre do debugowania.

Następnym problemem jest prawdopodobnie problem z ścieżką ... ponieważ skrypt prawdopodobnie próbuje wykonać z katalogu domowego. Ten skrypt ustawia bieżący katalog, wyświetla go w pliku, a następnie uruchamia program.

Spróbuj tego:

Script File

#!/bin/sh 
cd "$(dirname "$0")"; 
CWD="$(pwd)" 
echo $CWD 
python your_python_file.py 

nadzieję, że ta oszczędność ktoś jakiś czas debugowania !!!

0

Spróbuj

* * * * * cd <directory_where_python_file_is> && bin/app etc/app_defaults.yaml 

Jest jakiś problem ścieżka z crona. Więc kiedy przejdziesz do katalogu z plikiem Pythona, cron działa jak urok!