Postępuję zgodnie z poradami na temat używania crontab online, i uruchomiłem sudo crontab -e
, a mój plik cron to:
MAILTO=cchilder@mail.usf.edu
* * * * * /home/cchilders/scripts/python/scripts-in-progress/update_projects.py
Nic mi nie wysyła, ale co gorsza, sprawdzam dziennik git pod kątem projektu, w którym wprowadziłem zmiany, a update_projects w ogóle nie działa. Kiedy uruchamiam go ręcznie, działa zgodnie z oczekiwaniami. Ze wszystkiego, co przeczytałem, naprawdę myślałem, że cronjobs są proste i potrzebowałem tylko czasu (5 symboli) i ścieżki do skryptu.
Próbowałem przetestować wywołanie skryptu, aby upewnić się, że zarówno ścieżka Pythona, jak i ścieżka skryptu są poprawne. W tym celu stworzyłem crontest.sh:
#!/bin/bash
/usr/bin/python /home/cchilders/scripts/python/scripts-in-progress/update_projects.py
Crontest.sh działa po wywołaniu z terminala. Nie przesłałem go do crontab użytkownika, sudo crontab i nadal nie działa.
Crontab użytkownika:
* * * * * /home/cchilders/scripts/bash/crontest.sh
* * * * * /home/cchilders/scripts/python/scripts-in-progress/update_projects.py
Sudo crontab:
MAILTO=cchilder@mail.usf.edu
* * * * * /home/cchilders/scripts/bash/crontest.sh
* * * * * /home/cchilders/scripts/python/scripts-in-progress/update_projects.py
Co jest w tym złego, jeśli ścieżka jest prawidłowa? Dziękuję Ci
update_projects.py wygląda następująco i działa z terminala:
#!/usr/bin/env python
import os, sys, time, subprocess
from os.path import expanduser
HOME = expanduser('~')
print 'running?
def call_sp(command, **arg_list):
#run that
p = subprocess.Popen(command, shell=True, **arg_list)
p.communicate()
def get_project_path():
i = 0
for root, dirs, files in os.walk(HOME):
if i >= 2:
return os.path.join(HOME, "projects")
i += 1
for this_dir in dirs:
if this_dir == "django_practice":
return os.path.join(HOME, "django_practice")
def update_projects(home_path):
i = 0
for root, dirs, files in os.walk(home_path):
for this_dir in dirs:
if this_dir.startswith("."):
continue
full_path = os.path.join(root, this_dir)
print full_path
time.sleep(2)
is_git_project = False
j = 0
for subroot, subdirs, subfiles in os.walk(full_path):
if j >= 1:
break
j += 1
if not ".git" in subdirs:
break
else:
is_git_project = True
if not is_git_project:
continue
d = {'cwd': full_path}
print 'git pull from {}'.format(full_path)
call_sp('git pull', **d)
time.sleep(2)
call_sp('git add -A', **d)
call_sp('git commit -m "automatic update"', **d)
call_sp('git push', **d)
dirs[:] = []
ppath = get_project_path()
update_projects(ppath)
-rwxrwxr-x. ... 17:32 update_projects.py
crontab -e
zamiast sudo crontab -e
)
crontab
środowisko wykonywania nie jest takie samo jak normalny terminal i nie zawsze ma tę samą zmienną PATH. Spróbuj uruchomić skrypt powłoki, który jawnie działa python
z pełną ścieżką (zwróconą przez which python
), a następnie pełną ścieżką do skryptu. Zauważam również, że odwołujesz się ~
do skryptu: będzie to katalog domowy, root
jeśli uruchamiasz go za pomocą sudo
, więc chyba, że tak naprawdę znajdują się tam twoje pliki, powinieneś zrobić, jak sugeruje @ncdownpat i uruchomić go od użytkownika crontab
.
#!/usr/bin/env python