Exécuter le script Python via crontab

90

J'essaye d'exécuter un script python en utilisant le crontab Linux. Je veux exécuter ce script toutes les 10 minutes.

J'ai trouvé beaucoup de solutions et aucune d'elles ne fonctionne. Par exemple: modifiez l'anacron dans /etc/cron.d ou utilisez crontab -e. J'ai mis cette ligne à la fin du fichier, mais cela ne change rien. Dois-je redémarrer un ou plusieurs services?

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

Quel fichier dois-je modifier pour configurer cela?

Merci d'avance


Voici le script.

#!/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
la source
Quand vous dites "ça ne change rien". Affiche-t-il une erreur, ne fonctionne-t-il pas? Quel est le comportement?
Raul Marengo
Est-ce que "Documents" au lieu de "Documents" est intentionnel?
Raul Marengo le
Il ne se produit simplement rien. :(
guisantogui
Cela dépasse le cadre de la question, mais qu'attendez-vous de votre script "listener.py"? Fait-il quelque chose qui pourrait indiquer qu'il a fonctionné? Do ps -ef | grep 'crond' dans votre ligne de commande pour vérifier si cron est en cours d'exécution.
Raul Marengo le
Non, ce script envoie plusieurs commandes cURL à un autre ordinateur. Quand j'exécute le "ps -f | grep 'crond'", il renvoie ceci: "souza 4736 3947 0 14:01 pts / 1 00:00:00 grep --color = auto crond"
guisantogui

Réponses:

131

Utilisez crontab -eet suivez simplement le tutoriel ici.

Regardez au point 3 pour un guide sur la façon de spécifier la fréquence.

En fonction de vos besoins, il devrait effectivement être:

*/10 * * * * /usr/bin/python script.py
Raul Marengo
la source
1
Je suis ce tutoriel, mais lorsque j'enregistre le fichier apparaît un message: "/tmp/crontab.JTQ0My/crontab":22: mauvaises minutes dans le fichier crontab, impossible d'installer. Voulez-vous réessayer la même modification? (y / n) "si je tape" y ", je suis retourné à l'édition du fichier. Et si je tape" n "le fichier n'est pas enregistré. J'ajoute cette ligne à la dernière ligne du fichier:" / 1 * * * * / usr / bin / python script.py "
guisantogui
@guisantogui il y a un point dans le tutoriel qui explique que l'utilisation de "/ 1" peut ne pas être prise en charge par tous les systèmes d'exploitation. Sur quel système d'exploitation exécutez-vous cela?
Raul Marengo
3
@guisantogui vient de remarquer qu'il vous manque un "*" avant le "/"
Raul Marengo
une autre façon est d'ajouter une déclaration env dans votre script.py. Voir mes commentaires sur la solution acceptée à: stackoverflow.com/questions/25633737/python-crontab-and-paths
Quetzalcoatl
Que faire si vous souhaitez exécuter le script.pyseul dans le répertoire donné?
Shubham A.
66

Mettez votre script dans un fichier foo.pycommençant par

#!/usr/bin/python

puis donnez l'autorisation d'exécution à ce script en utilisant

chmod a+x foo.py

et utilisez le chemin complet de votre foo.pyfichier dans votre fichier crontab.

Voir la documentation de execve (2) qui gère le shebang

Basile Starynkevitch
la source
1
@Tomer S'il s'agit de shscripts shell POSIX alors oui. Si elles utilisent des fonctionnalités spécifiques non standard ksh, zshou bashalors ils doivent être exécutés en utilisant cette enveloppe spécifique.
tripleee
25

Comme vous l'avez mentionné ne change rien ,

Tout d'abord, vous devez rediriger à la fois stdin et stderr de l'exécution de crontab comme ci-dessous:

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

alors vous pouvez afficher le fichier /tmp/listener.logpour voir si le script s'est exécuté comme prévu.

Deuxièmement, devinez ce que vous entendez par changer quoi que ce soit en regardant les fichiers créés par votre programme:

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

le travail crontab ci-dessus ne créera pas ces fichiers dans le répertoire /home/souza/Documets/Listener, car le travail cron n'est pas exécuté dans ce répertoire et vous utilisez le chemin relatif dans le programme. Donc, pour créer ces fichiers dans le répertoire /home/souza/Documets/Listener, le travail cron suivant fera l'affaire:

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

Accédez au répertoire de travail et exécutez le script à partir de là, puis vous pouvez afficher les fichiers créés sur place.

greenqy
la source
que signifie 2> & 1?
Mohideen bin Mohammed
1
@MohideenibnMohammed redirige les messages d'erreur ( stderr) vers la ligne de commande visible ( stdout)
Juha Untinen
Cette réponse est celle que vous devez utiliser si vous utilisez des chemins relatifs.
DaReal