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.