làm thế nào để có được cronjob chạy mỗi phút


2

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 -evà 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)

2
1) tập lệnh của bạn có tập bit thực thi không? 2) tập lệnh Python của bạn có dòng shebang Python khi bắt đầu không? #!/usr/bin/env python
nc4pk

ya, nó hiểu rồi ... idk ý của bạn là gì # 1
codyc4321

1
quyền cao -rwxrwxr-x. ... 17:32 update_projects.py
codyc4321

Điều gì xảy ra nếu bạn đặt tập lệnh vào crontab của người dùng thay vì root? ( crontab -e thay vì sudo crontab -e )
nc4pk

1
Tôi đã có vấn đề vì 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.
AFH

Câu trả lời:


1

Đặt / usr / bin / python vào mục crontab.

* * * * * /usr/bin/python /home/cchilders/scripts/python/scripts-in-progress/update_projects.py

đáng ngạc nhiên, ngay cả điều đó đã không làm việc. Tôi đã thử nó trong người dùng và sudo crontab
codyc4321
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.