Thực thi tập lệnh Python qua crontab


90

Tôi đang cố gắng thực thi một tập lệnh python bằng Linux crontab. Tôi muốn chạy tập lệnh này 10 phút một lần.

Tôi đã tìm thấy rất nhiều giải pháp và không có giải pháp nào hiệu quả. Ví dụ: chỉnh sửa anacron tại /etc/cron.d hoặc sử dụng crontab -e. Tôi đặt dòng này ở cuối tệp, nhưng nó không thay đổi bất cứ điều gì. Tôi có phải khởi động lại bất kỳ (các) dịch vụ nào không?

*/2 * * * * /usr/bin/python /home/souza/Documets/Listener/listener.py

Tôi phải chỉnh sửa tệp nào để cấu hình tệp này?

Cảm ơn trước


Đây là kịch bản.

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import json
import os
import pycurl
import sys
import cStringIO

if __name__ == "__main__":

    name_server_standart = "Server created by script %d"
    json_file_standart = "{ \"server\" : {  \"name\" : \"%s\", \"imageRef\" : \"%s\", \"flavorRef\" : \"%s\" } }"

    curl_auth_token = pycurl.Curl()

    gettoken = cStringIO.StringIO()

    curl_auth_token.setopt(pycurl.URL, "http://192.168.100.241:8774/v1.1")
    curl_auth_token.setopt(pycurl.POST, 1)
    curl_auth_token.setopt(pycurl.HTTPHEADER, ["X-Auth-User: cpca", 
                          "X-Auth-Key: 438ac2d9-689f-4c50-9d00-c2883cfd38d0"])

    curl_auth_token.setopt(pycurl.HEADERFUNCTION, gettoken.write)
    curl_auth_token.perform()
    chg = gettoken.getvalue()

    auth_token = chg[chg.find("X-Auth-Token: ")+len("X-Auth-Token: ") : chg.find("X-Server-Management-Url:")-1]

    token = "X-Auth-Token: {0}".format(auth_token)
    curl_auth_token.close()

    #----------------------------

    getter = cStringIO.StringIO()
    curl_hab_image = pycurl.Curl()
    curl_hab_image.setopt(pycurl.URL, "http://192.168.100.241:8774/v1.1/nuvemcpca/images/7")
    curl_hab_image.setopt(pycurl.HTTPGET, 1) #tirei essa linha e funcionou, nao sei porque
    curl_hab_image.setopt(pycurl.HTTPHEADER, [token])

    curl_hab_image.setopt(pycurl.WRITEFUNCTION, getter.write)
    #curl_list.setopt(pycurl.VERBOSE, 1)
    curl_hab_image.perform()
    curl_hab_image.close()

    getter = cStringIO.StringIO()

    curl_list = pycurl.Curl()
    curl_list.setopt(pycurl.URL, "http://192.168.100.241:8774/v1.1/nuvemcpca/servers/detail")
    curl_list.setopt(pycurl.HTTPGET, 1) #tirei essa linha e funcionou, nao sei porque
    curl_list.setopt(pycurl.HTTPHEADER, [token])

    curl_list.setopt(pycurl.WRITEFUNCTION, getter.write)
    #curl_list.setopt(pycurl.VERBOSE, 1)
    curl_list.perform()
    curl_list.close()

    #----------------------------

    resp = getter.getvalue()    

    con = int(resp.count("status"))

    s = json.loads(resp)

    lst = []

    for i in range(con):
        lst.append(s['servers'][i]['status'])

    for j in range(len(lst)):
        actual = lst.pop()
        print actual

        if actual != "ACTIVE" and actual != "BUILD" and actual != "REBOOT" and actual != "RESIZE":

            print "Entra no If"

            f = file('counter', 'r+w')

            num = 0
            for line in f:
                num = line

            content = int(num)+1    

            ins = str(content)

            f.seek(0)
            f.write(ins)
            f.truncate()
            f.close()

            print "Contador"

            json_file = file('json_file_create_server.json','r+w')

            name_server_final = name_server_standart % content
            path_to_image = "http://192.168.100.241:8774/v1.1/nuvemcpca/images/7"
            path_to_flavor = "http://192.168.100.241:8774/v1.1/nuvemcpca/flavors/1"

            new_json_file_content = json_file_standart % (name_server_final, path_to_image, path_to_flavor)

            json_file.seek(0)
            json_file.write(new_json_file_content)
            json_file.truncate()
            json_file.close()

            print "Json File"

            fil = file("json_file_create_server.json")
            siz = os.path.getsize("json_file_create_server.json")

            cont_size = "Content-Length: %d" % siz
            cont_type = "Content-Type: application/json"
            accept = "Accept: application/json"

            c_create_servers = pycurl.Curl()

            logger = cStringIO.StringIO()

            c_create_servers.setopt(pycurl.URL, "http://192.168.100.241:8774/v1.1/nuvemcpca/servers")

            c_create_servers.setopt(pycurl.HTTPHEADER, [token, cont_type, accept, cont_size])

            c_create_servers.setopt(pycurl.POST, 1)

            c_create_servers.setopt(pycurl.INFILE, fil)

            c_create_servers.setopt(pycurl.INFILESIZE, siz)

            c_create_servers.setopt(pycurl.WRITEFUNCTION, logger.write)

            print "Teste perform"

            c_create_servers.perform()

            print logger.getvalue()

            c_create_servers.close()

Khi bạn nói "nó không thay đổi bất cứ điều gì". Nó hiện lỗi, không chạy? Hành vi là gì?
Raul Marengo

"Documets" thay vì "Documents" có chủ ý không?
Raul Marengo

Đơn giản là không xảy ra bất cứ điều gì. :(
guisantogui

Loại này vượt ra ngoài phạm vi của câu hỏi, nhưng bạn mong đợi tập lệnh "listener.py" của mình để làm gì? Nó có làm bất cứ điều gì có thể chỉ ra rằng nó đã chạy không? Làm ps -ef | grep 'crond' trong dòng lệnh của bạn để kiểm tra xem cron có đang chạy hay không.
Raul Marengo

Không, tập lệnh này gửi một số lệnh của cURL đến một máy tính khác. Khi tôi thực hiện "ps -f | grep 'crond", nó sẽ trả về này: "Souza 4736 3947 0 14:01 pts / 1 0:00:00 grep --color = auto crond"
guisantogui

Câu trả lời:


131

Chỉ cần sử dụng crontab -evà làm theo hướng dẫn tại đây.

Nhìn vào điểm 3 để biết hướng dẫn về cách chỉ định tần số.

Dựa trên yêu cầu của bạn, hiệu quả phải là:

*/10 * * * * /usr/bin/python script.py

1
Tôi làm theo hướng dẫn này nhưng khi tôi lưu tệp xuất hiện thông báo: "/tmp/crontab.JTQ0My/crontab":22: lỗi phút xấu trong tệp crontab, không thể cài đặt. Bạn có muốn thử lại cùng một chỉnh sửa không? (y / n) "nếu tôi nhập" y ", tôi đã quay lại chỉnh sửa tệp. Và nếu tôi nhập" n ", tệp sẽ không được lưu. Tôi thêm dòng này vào dòng cuối cùng của tệp:" / 1 * * * * / usr / bin / python script.py "
guisantogui

@guisantogui có một điểm trong hướng dẫn giải thích rằng việc sử dụng "/ 1" có thể không được tất cả các hệ điều hành hỗ trợ. Bạn đang chạy cái này trên hệ điều hành nào?
Raul Marengo

3
@guisantogui vừa nhận thấy bạn thiếu dấu "*" trước dấu "/"
Raul Marengo

một cách khác là thêm khai báo env trong script.py của bạn. Xem bình luận của tôi với các giải pháp được chấp nhận tại địa chỉ: stackoverflow.com/questions/25633737/python-crontab-and-paths
Quetzalcoatl

Điều gì xảy ra nếu bạn muốn thực thi script.pychỉ trong thư mục nhất định?
Shubham A.

66

Đặt tập lệnh của bạn vào một tệp foo.pybắt đầu bằng

#!/usr/bin/python

sau đó cấp quyền thực thi cho tập lệnh đó bằng cách sử dụng

chmod a+x foo.py

và sử dụng đường dẫn đầy đủ của foo.pytệp của bạn trong của bạn crontab.

Xem tài liệu về hành động (2) đang xử lý shebang


1
@Tomer Nếu chúng là shtập lệnh shell POSIX thì có. Nếu họ sử dụng các tính năng chuẩn cụ thể để ksh, zshhoặc bashsau đó họ cần phải được chạy sử dụng mà cụ thể vỏ.
tripleee

25

Như bạn đã đề cập không thay đổi bất cứ điều gì ,

Đầu tiên, bạn nên chuyển hướng cả stdin và stderr từ việc thực thi crontab như dưới đây:

*/2 * * * * /usr/bin/python /home/souza/Documets/Listener/listener.py > /tmp/listener.log 2>&1

thì bạn có thể xem tệp /tmp/listener.logđể biết liệu tập lệnh có được thực thi như bạn mong đợi hay không.

Thứ hai, hãy đoán ý bạn là thay đổi bất cứ thứ gì bằng cách xem các tệp được tạo bởi chương trình của bạn:

f = file('counter', 'r+w')
json_file = file('json_file_create_server.json','r+w')

công việc crontab ở trên sẽ không tạo tệp này trong thư mục /home/souza/Documets/Listener, vì công việc cron không được thực thi trong thư mục này và bạn sử dụng đường dẫn tương đối trong chương trình. Vì vậy, để tạo các tệp này trong thư mục /home/souza/Documets/Listener, lệnh cron sau sẽ thực hiện thủ thuật:

*/2 * * * * cd /home/souza/Documets/Listener && /usr/bin/python listener.py > /tmp/listener.log 2>&1

Thay đổi thư mục làm việc và thực thi tập lệnh từ đó, sau đó bạn có thể xem các tệp được tạo tại chỗ.


2> & 1 có nghĩa là gì?
Mohideen bin Mohammed

1
Thông điệp @MohideenibnMohammed lỗi chuyển hướng ( stderr) vào dòng lệnh có thể nhìn thấy ( stdout)
Juha Untinen

Câu trả lời này là câu trả lời bạn nên sử dụng nếu bạn đang sử dụng các đường dẫn tương đối.
DaReal
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.