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()
Réponses:
Utilisez
crontab -e
et 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
la source
script.py
seul dans le répertoire donné?Mettez votre script dans un fichier
foo.py
commençant par#!/usr/bin/python
puis donnez l'autorisation d'exécution à ce script en utilisant
et utilisez le chemin complet de votre
foo.py
fichier dans votre fichiercrontab
.Voir la documentation de execve (2) qui gère le shebang
la source
sh
scripts shell POSIX alors oui. Si elles utilisent des fonctionnalités spécifiques non standardksh
,zsh
oubash
alors ils doivent être exécutés en utilisant cette enveloppe spécifique.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.log
pour 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.
la source
stderr
) vers la ligne de commande visible (stdout
)