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()

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

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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.