Le script Python n'écrira pas de données lorsqu'il est exécuté depuis cron

6

Lorsque je lance un script python dans un terminal, il fonctionne comme prévu; télécharge le fichier et l’enregistre à l’endroit désiré.

sudo python script.py    

J'ai ajouté le script python à la crontab racine, mais il s'exécute comme il est supposé sauf qu'il n'écrit pas le fichier.

$ sudo crontab -l
> * * * * * python /home/test/script.py >> /var/log/test.log 2>&1

Voici un script simplifié qui pose toujours problème:

#!/usr/bin/python

scheduleUrl = 'http://test.com/schedule.xml'
schedule = '/var/test/schedule.xml'

# Download url and save as filename
def wget(url, filename):
    import urllib2
    try:
        response = urllib2.urlopen(url)
    except Exception:
        import traceback
        logging.exception('generic exception: ' + traceback.format_exc())
    else:
        print('writing:'+filename+';')
        output = open(filename,'wb')
        output.write(response.read())
        output.close()

# Download the schedule
wget(scheduleUrl, schedule)

Je reçois le message "écriture: nom du fichier"; à l'intérieur du journal, à laquelle les entrées cron sortent. Mais le fichier actuel est introuvable.

Le répertoire / var / test est modifié en 777 et, quel que soit l'utilisateur, je suis autorisé à ajouter et à modifier les fichiers à ma guise.

    
posée Ruud 28.11.2011 - 22:47
la source

4 réponses

2
  • Vérifier les fichiers journaux grep -i cron /var/log/syslog
  • Ajoutez une ligne vide à la fin de la crontab, cela a été un bogue connu depuis longtemps, vous ne savez pas si elle est résolue.
  • Supprimez le 2>&1 de la ligne de commande jusqu'à ce qu'il fonctionne comme prévu. Toute erreur utile est redirigée vers un fichier non créé. effectivement perdu.
  • Vérifiez si le courrier racine a bien été reçu (par exemple, en utilisant mutt ou /var/spool/mail ). Les messages d'erreur de cron sont envoyés au courrier électronique du système par défaut.

Aussi:

  • Revoyez les autorisations 777 dès que possible. 755 root: root devrait être suffisant pour vérifier les logs des utilisateurs non privilégiés quand il est exécuté depuis la racine
  • Réexaminer le fonctionnement du script depuis la racine, c'est une mauvaise pratique.
réponse donnée jippie 07.04.2012 - 23:43
la source
1

Ce qui fonctionne pour moi

Crontab

#Borrowed from anacron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   python /home/username/somedir/test.py

Script Python

scheduleUrl = 'http://example.com/index.html'
schedule = '/tmp/test.html'

# Download url and save as filename
def wget(url, filename):
    import urllib2
    try:
        response = urllib2.urlopen(url)
    except Exception:
        import logging
        logging.exception('error')
    else:
        print('writing:'+filename+';')
        output = open(filename,'wb')
        output.write(response.read())
        output.close()

# Download the schedule
wget(scheduleUrl, schedule)

Ajout de variables d'environnement. Utilisé tmp au lieu de var pour vérifier qu'il n'y avait pas de problèmes d'autorisations.

    
réponse donnée RobotHumans 08.04.2012 - 05:17
la source
0

Pour moi, la solution était aussi simple que de changer le mode d’accès aux fichiers. Au lieu de:

output = open(filename,'wb')

Essayez:

output = open(filename,'rb+')

J'ai utilisé ceci pour gratter la liste de craigs pour les offres d'emploi (pour moi) et pour modéliser dans une base de données. Tout est fait sur un pi de framboise.

J'ai trouvé cela et c'est très similaire au problème que je rencontrais, même si je n'ai pas bien compris ma réponse ici. Le travail cron était en cours d'exécution mais le script python n'écrivait pas les fichiers lorsqu'il était exécuté via un travail cron. Le script écrirait des fichiers texte web raclés s’il était exécuté à partir de la ligne de commande.

La solution pour moi était simplement le wb à rb+ rb+ Ouvre un fichier pour la lecture et l'écriture au format binaire. Le pointeur de fichier placé au début du fichier.

    
réponse donnée Andrew Sychra 06.03.2016 - 01:02
la source
0

J'ai eu un problème similaire:

f = open('./my_file.txt', 'w')
f.close()

N'ouvrait et n'écrivait pas le fichier lorsqu'il était exécuté depuis cron. Cela l'a résolu

f = open('<full_path_of_file>/my_file.txt', 'w')
f.close()
    
réponse donnée Luis Miguel 08.04.2018 - 14:33
la source

Lire d'autres questions sur les étiquettes