Jalankan skrip Python melalui crontab

90

Saya mencoba menjalankan skrip python menggunakan crontab Linux. Saya ingin menjalankan skrip ini setiap 10 menit.

Saya menemukan banyak solusi dan tidak ada yang berhasil. Misalnya: edit anacron di /etc/cron.d atau gunakan crontab -e. Saya meletakkan baris ini di akhir file, tetapi tidak mengubah apa pun. Apakah saya harus memulai ulang layanan apa pun?

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

File apa yang harus saya edit untuk mengkonfigurasi ini?

Terima kasih sebelumnya


Ini skripnya.

#!/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()
guisantogui
sumber
Saat Anda mengatakan "itu tidak mengubah apa pun". Apakah itu menunjukkan kesalahan, apakah itu tidak berjalan? Apa perilakunya?
Raul Marengo
apakah "Documets" bukan "Documents" disengaja?
Raul Marengo
Tidak terjadi apa-apa. :(
guisantogui
Semacam ini melampaui lingkup pertanyaan, tetapi, apa yang Anda harapkan dari skrip "listener.py" Anda? Apakah itu melakukan sesuatu yang dapat menunjukkan bahwa itu telah berjalan? Lakukan ps -ef | grep 'crond' di baris perintah Anda untuk memeriksa apakah cron sedang berjalan.
Raul Marengo
Tidak, skrip ini mengirim beberapa perintah cURL ke komputer lain. Ketika saya menjalankan "ps -f | grep 'crond'", ia mengembalikan ini: "souza 4736 3947 0 14:01 pts / 1 00:00:00 grep --color = auto crond"
guisantogui

Jawaban:

131

Cukup gunakan crontab -edan ikuti tutorialnya di sini.

Lihat poin 3 untuk panduan tentang cara menentukan frekuensi.

Berdasarkan kebutuhan Anda, secara efektif harus:

*/10 * * * * /usr/bin/python script.py
Raul Marengo
sumber
1
Saya mengikuti tutorial ini, tetapi ketika saya menyimpan file tersebut muncul pesan: "/tmp/crontab.JTQ0My/crontab":22: kesalahan menit yang buruk di file crontab, tidak dapat diinstal. Apakah Anda ingin mencoba lagi pengeditan yang sama? (y / n) "jika saya mengetik" y ", saya kembali ke edit file. Dan jika saya mengetik" n ", file tersebut tidak disimpan. Saya menambahkan baris ini di baris terakhir file:" / 1 * * * * / usr / bin / python script.py "
guisantogui
@guisantogui ada satu hal dalam tutorial yang menjelaskan bahwa penggunaan "/ 1" mungkin tidak didukung oleh semua sistem operasi. Di sistem operasi apa Anda menjalankan ini?
Raul Marengo
3
@guisantogui baru saja menyadari bahwa Anda kehilangan "*" sebelum "/"
Raul Marengo
cara lain adalah dengan menambahkan deklarasi env di script.py Anda. Lihat komentar saya untuk solusi yang diterima di: stackoverflow.com/questions/25633737/python-crontab-and-paths
Quetzalcoatl
Bagaimana jika Anda ingin mengeksekusi script.pysatu - satunya di direktori yang diberikan?
Shubham A.
66

Letakkan skrip Anda dalam file yang foo.pydimulai dengan

#!/usr/bin/python

kemudian berikan izin eksekusi ke skrip itu menggunakan

chmod a+x foo.py

dan gunakan jalur lengkap foo.pyfile Anda di crontab.

Lihat dokumentasi dari execve (2) yang menangani shebang tersebut

Basile Starynkevitch
sumber
1
@Tomer Jika mereka adalah shskrip shell POSIX maka ya. Jika mereka menggunakan fitur tidak standar khusus untuk ksh, zsh, atau bashmaka mereka perlu dijalankan menggunakan yang shell tertentu.
tripleee
25

Seperti yang Anda sebutkan tidak mengubah apa pun ,

Pertama, Anda harus mengalihkan stdin dan stderr dari eksekusi crontab seperti di bawah ini:

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

kemudian Anda dapat melihat file tersebut /tmp/listener.loguntuk melihat apakah skrip dijalankan seperti yang Anda harapkan.

Kedua, tebak maksud Anda mengubah apa pun adalah dengan melihat file yang dibuat oleh program Anda:

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

tugas crontab di atas tidak akan membuat file ini di direktori /home/souza/Documets/Listener, karena tugas cron tidak dijalankan di direktori ini, dan Anda menggunakan jalur relatif dalam program. Jadi untuk membuat file ini di direktori /home/souza/Documets/Listener, pekerjaan cron berikut akan melakukan triknya:

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

Ubah ke direktori kerja dan jalankan skrip dari sana, lalu Anda dapat melihat file yang dibuat di tempatnya.

greenqy.dll
sumber
apa arti 2> & 1?
Mohideen bin Mohammed
1
@MohideenibnMohammed mengarahkan pesan kesalahan ( stderr) ke baris perintah yang terlihat ( stdout)
Juha Untinen
Jawaban ini adalah yang harus Anda gunakan jika Anda menggunakan jalur relatif.
DaReal