111 votes

Exécuter le script Python script via la crontab

J'essaie d'exécuter un script Python script à l'aide du logiciel Linux crontab . Je veux exécuter ce script toutes les 10 minutes.

J'ai trouvé de nombreuses solutions, mais aucune n'a fonctionné. Par exemple : modifier l'anacron à /etc/cron.d ou utiliser crontab -e . J'ai placé 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 ?


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

161voto

Raul Marengo Points 2017

Il suffit d'utiliser crontab -e et suivre le tutoriel ici.

Le point 3 fournit des indications sur la manière de spécifier la fréquence.

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

*/10 * * * * /usr/bin/python script.py

77voto

Basile Starynkevitch Points 67055

Placez votre script dans un fichier foo.py en commençant par

#!/usr/bin/python

Donnez ensuite l'autorisation d'exécution à ce script en utilisant

chmod a+x foo.py

et utilisez le chemin complet de votre foo.py dans votre crontab .

Voir la documentation de execve(2) qui s'occupe de la shebang .

40voto

greenqy Points 486

Comme vous l'avez mentionné ne change rien .

Tout d'abord, vous devez rediriger les deux entrée standard y erreur standard à partir de l'exécution de la crontab comme ci-dessous :

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

Vous pouvez ensuite consulter le fichier /tmp/listener.log pour voir si le script s'est exécuté comme prévu.

Deuxièmement, je suppose que ce que vous entendez par changer quoi que ce soit est d'observer les fichiers créés par votre programme :

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

La tâche crontab ci-dessus ne créera pas ces fichiers dans le répertoire /home/souza/Documets/Listener car la tâche cron n'est pas exécutée dans ce répertoire, et vous utilisez un chemin relatif dans le programme. Donc pour créer ce fichier dans le répertoire /home/souza/Documets/Listener La tâche cron suivante fera l'affaire :

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

Changez de répertoire de travail et exécutez le script à partir de là, et vous pourrez alors voir les fichiers créés en place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X