Tôi đang làm theo lời khuyên về việc sử dụng crontab trực tuyến và tôi đã chạy sudo crontab -e
và tệp cron của tôi là:
MAILTO=cchilder@mail.usf.edu
* * * * * /home/cchilders/scripts/python/scripts-in-progress/update_projects.py
Nó không gửi thư cho tôi bất cứ điều gì, nhưng tệ hơn, tôi đang kiểm tra nhật ký git của mình cho một dự án tôi đã thực hiện thay đổi và update_projects hoàn toàn không chạy. Khi tôi chạy nó bằng tay, nó hoạt động như mong đợi. Từ tất cả những gì tôi đọc, tôi thực sự nghĩ rằng cronjobs rất đơn giản và chỉ cần một thời gian (5 biểu tượng) và đường dẫn đến một kịch bản.
Tôi đã thử kiểm tra lệnh gọi script để đảm bảo cả đường dẫn python và đường dẫn script đều chính xác. Đối với điều này, tôi đã thực hiện crontest.sh:
#!/bin/bash
/usr/bin/python /home/cchilders/scripts/python/scripts-in-progress/update_projects.py
Crontest.sh hoạt động khi được gọi từ thiết bị đầu cuối. Tôi không tải nó lên trong crontab của người dùng, sudo crontab, và nó vẫn không chạy.
Người dùng crontab:
* * * * * /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
Điều gì là sai về điều này, nếu con đường là chính xác? Cảm ơn bạn
update_projects.py trông như sau và đang hoạt động từ thiết bị đầu cuối:
#!/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
thay vì sudo crontab -e
)
crontab
môi trường thực thi không giống như một thiết bị đầu cuối bình thường và không phải lúc nào cũng có cùng biến PATH. Hãy thử khởi chạy một tập lệnh shell chạy rõ ràng python
với đường dẫn đầy đủ của nó (được trả về bởi which python
), theo sau là đường dẫn đầy đủ đến tập lệnh của bạn. Tôi cũng nhận thấy rằng bạn đang tham khảo ~
trong kịch bản: đây sẽ là thư mục chính của root
nếu bạn khởi chạy nó bằng sudo
, vì vậy trừ khi đây thực sự là nơi tệp của bạn cư trú, bạn nên làm như @ncdownpat gợi ý và chạy nó từ người dùng của bạn crontab
.
#!/usr/bin/env python