Führen Sie das Python-Skript über crontab aus

88

Ich versuche, ein Python-Skript mit der Linux-Crontab auszuführen. Ich möchte dieses Skript alle 10 Minuten ausführen.

Ich habe viele Lösungen gefunden und keine davon funktioniert. Beispiel: Bearbeiten Sie das Anakron unter /etc/cron.d oder verwenden Sie crontab -e. Ich habe diese Zeile am Ende der Datei eingefügt, aber sie ändert nichts. Muss ich einen Dienst neu starten?

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

Welche Datei muss ich bearbeiten, um dies zu konfigurieren?

Danke im Voraus


Hier ist das Skript.

#!/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
quelle
Wenn Sie sagen "es ändert nichts". Zeigt es einen Fehler an, läuft es nicht? Wie ist das Verhalten?
Raul Marengo
ist "Documets" anstelle von "Documents" beabsichtigt?
Raul Marengo
Kommt einfach nichts vor. :(
Guisantogui
Diese Art geht über den Rahmen der Frage hinaus, aber was erwarten Sie von Ihrem "listener.py" -Skript? Tut es irgendetwas, das darauf hinweisen könnte, dass es gelaufen ist? Mach ps -ef | grep 'crond' in deiner Kommandozeile, um zu überprüfen, ob cron läuft.
Raul Marengo
Nein, dieses Skript sendet mehrere cURL-Befehle an einen anderen Computer. Wenn ich "ps -f | grep 'crond'" ausführe, wird Folgendes zurückgegeben: "souza 4736 3947 0 14:01 pts / 1 00:00:00 grep --color = auto crond"
guisantogui

Antworten:

131

Verwenden Sie einfach crontab -edas Tutorial hier und folgen Sie ihm .

In Punkt 3 finden Sie eine Anleitung zum Festlegen der Frequenz.

Basierend auf Ihrer Anforderung sollte es effektiv sein:

*/10 * * * * /usr/bin/python script.py
Raul Marengo
quelle
1
Ich folge diesem Tutorial, aber wenn ich die Datei speichere, erscheint eine Meldung: "/tmp/crontab.JTQ0My/crontab":22: Fehler in der Crontab-Datei können nicht installiert werden. Möchten Sie dieselbe Bearbeitung wiederholen? (j / n) "Wenn ich" y "eingebe, bin ich zur Dateibearbeitung zurückgekehrt. Wenn ich" n "eingebe, wird die Datei nicht gespeichert. Ich füge diese Zeile in der letzten Zeile der Datei hinzu:" / 1 * * * * / usr / bin / python script.py "
guisantogui
@guisantogui Es gibt einen Punkt im Tutorial, der erklärt, dass die Verwendung von "/ 1" möglicherweise nicht von allen Betriebssystemen unterstützt wird. Auf welchem ​​Betriebssystem läuft das?
Raul Marengo
3
@guisantogui gerade bemerkt, dass Sie ein "*" vor dem "/"
Raul Marengo
Eine andere Möglichkeit besteht darin, eine env-Deklaration in Ihre script.py einzufügen. Siehe meine Kommentare zur akzeptierten Lösung unter: stackoverflow.com/questions/25633737/python-crontab-and-paths
Quetzalcoatl
Was ist, wenn Sie das script.pyeinzige im angegebenen Verzeichnis ausführen möchten ?
Shubham A.
62

Fügen Sie Ihr Skript in eine Datei ein, foo.pydie mit beginnt

#!/usr/bin/python

Geben Sie dann diesem Skript die Ausführungsberechtigung mit

chmod a+x foo.py

und verwenden Sie den vollständigen Pfad Ihrer foo.pyDatei in Ihrem crontab.

Siehe Dokumentation von execve (2), das den Shebang behandelt

Basile Starynkevitch
quelle
1
@Tomer Wenn es sich um POSIX- shShell-Skripte handelt, dann ja. Wenn sie nicht standardmäßige Funktionen verwenden , die für oder spezifisch kshsind zsh, oder bashdann müssen sie mit dieser spezifischen Shell ausgeführt werden.
Tripleee
23

Wie Sie erwähnt haben, ändert sich nichts ,

Zunächst sollten Sie sowohl stdin als auch stderr von der Crontab-Ausführung wie folgt umleiten:

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

Anschließend können Sie die Datei anzeigen, um festzustellen /tmp/listener.log, ob das Skript wie erwartet ausgeführt wurde.

Zweitens, raten Sie mal, was Sie damit meinen , etwas zu ändern, indem Sie sich die von Ihrem Programm erstellten Dateien ansehen:

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

Der obige crontab-Job erstellt diese Datei nicht im Verzeichnis /home/souza/Documets/Listener, da der cron-Job in diesem Verzeichnis nicht ausgeführt wird und Sie den relativen Pfad im Programm verwenden. Um diese Datei im Verzeichnis zu erstellen /home/souza/Documets/Listener, reicht der folgende Cron-Job aus:

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

Wechseln Sie in das Arbeitsverzeichnis und führen Sie das Skript von dort aus aus. Anschließend können Sie die an Ort und Stelle erstellten Dateien anzeigen.

greenqy
quelle
Was bedeutet 2> & 1?
Mohideen bin Mohammed
1
@MohideenibnMohammed leiten Fehlermeldungen ( stderr) zur sichtbaren Befehlszeile ( stdout) um
Juha Untinen
Diese Antwort sollten Sie verwenden, wenn Sie relative Pfade verwenden.
DaReal