Pour enregistrer un travail python dans cron et l'exécuter périodiquement dans un environnement venv
Vous pouvez utiliser python dans l'environnement venv que vous souhaitez utiliser.
$ crontab -e
* * * * * cd [Chemin absolu]; venv/bin/python foo.py
Je veux écrire la date et l'heure dans un fichier au format jsonline une fois par minute.
Environnement OS
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G87
Créez un répertoire, créez un environnement virtuel venv et installez le package jsonlines utilisé cette fois.
$ mkdir [endroit]
$ cd [endroit]
$ python -V
Python 3.7.1
$ python -m venv venv
$ source venv/bin/activate
(venv) $ pip install jsonlines
Écrivez un script python. La date et l'heure du traitement sont écrites sous la forme jsonline dans out.jsonl. Imprimez également pour confirmation.
dt2jsonl.py
import datetime
import jsonlines
dt = datetime.datetime.now()
dict_now = {'date': str(dt.date()), 'time': str(dt.time())}
with jsonlines.open('out.jsonl', mode='a') as writer:
writer.write(dict_now)
print('updated: '+ str(dt))
Une fois traitée, la sortie ressemble à ceci.
(venv) $ python dt2jsonl.py
updated: 2020-01-26 17:39:23.435616
(venv) $ cat out.jsonl
{"date": "2020-01-26", "time": "17:39:23.435616"}
Essayez de vous inscrire avec cron en tant que python dt2jsonl.py
. Puisqu'il s'agit de «* * * * *», il doit être traité une fois par minute.
Écrivez stderr et stdout dans /tmp/cron.log avec >> /tmp/cron.log 2> & 1
pour vérifier l'erreur et afficher le résultat.
(venv) $ crontab -e
* * * * * python dt2jsonl.py >> /tmp/cron.log 2>&1
En attendant, il y a une erreur dans / tmp / cron.log
(venv) $ tail -f /tmp/cron.log
python: can't open file 'dt2jsonl.py': [Errno 2] No such file or directory
Il semble que dt2jsonl.py
ne puisse pas être trouvé, alors vérifiez où se trouve le cron.
(venv) $ crontab -e
* * * * * pwd >> /tmp/cron.log 2>&1
(venv) $ tail -f /tmp/cron.log
/Users/[Utilisateur]
Puisque vous êtes dans le répertoire utilisateur, je vais vous indiquer le chemin absolu du script.
(venv) $ crontab -e
* * * * * python /Users/[Utilisateur]/[endroit]/dt2jsonl.py >> /tmp/cron.log 2>&1
(venv) $ tail -f /tmp/cron.log
Traceback (most recent call last):
File "/Users/[Utilisateur]/[endroit]/dt2jsonl.py", line 2, in <module>
import jsonlines
ImportError: No module named jsonlines
Cette fois, je suis arrivé au script python, mais sans jsonlines. Puisqu'il ne fonctionne pas dans l'environnement venv, vérifiez quel python est utilisé par cron.
(venv) $ crontab -e
* * * * * which python >> /tmp/cron.log 2>&1; python -V >> /tmp/cron.log 2>&1
(venv) $ tail -f /tmp/cron.log
/usr/bin/python
Python 2.7.10
J'utilise le système python2.7, donc je devrais faire quelque chose. Vérifiez quel python utiliser.
(venv) $ which python
/Users/[Utilisateur]/[endroit]/venv/bin/python
Réécrire en python sous venv.
(venv) $ crontab -e
* * * * * /Users/[Utilisateur]/[endroit]/venv/bin/python /Users/[Utilisateur]/[endroit]/dt2jsonl.py >> /tmp/cron.log 2>&1
Après une courte attente, j'ai obtenu le résultat d'impression dans / tmp / cron.log
.
(venv) $ tail -f /tmp/cron.log
updated: 2020-01-26 17:48:00.924120
(venv) $ cat out.jsonl
{"date": "2020-01-26", "time": "17:39:23.435616"}
Je pensais qu'il était également écrit en tant que jsonline dans out.jsonl, mais il avait été exécuté manuellement au début, pas le résultat de son exécution avec cron. Il se trouvait dans le répertoire utilisateur car il était exécuté dans le répertoire utilisateur.
(venv) $ cat ~/out.jsonl
{"date": "2020-01-26", "time": "17:48:00.924120"}
{"date": "2020-01-26", "time": "17:49:01.102146"}
{"date": "2020-01-26", "time": "17:50:00.278025"}
L'emplacement de la sortie est différent, mais cron l'a géré dans l'environnement venv. Il est bon de spécifier la sortie du script python avec un chemin absolu, Cette fois, changez le répertoire d'exécution de cron.
(venv) $ crontab -e
* * * * * cd /Users/[Utilisateur]/[endroit]; venv/bin/python dt2jsonl.py >> /tmp/cron.log 2>&1
C'est ce à quoi je m'attendais.
(venv) $ tail -f /tmp/cron.log
updated: 2020-01-26 17:55:00.837256
(venv) $ cat out.jsonl
{"date": "2020-01-26", "time": "17:39:23.435616"}
{"date": "2020-01-26", "time": "17:55:00.837256"}
Attends une minute
(venv) $ cat out.jsonl
{"date": "2020-01-26", "time": "17:39:23.435616"}
{"date": "2020-01-26", "time": "17:55:00.837256"}
{"date": "2020-01-26", "time": "17:56:00.986909"}
{"date": "2020-01-26", "time": "17:57:01.167183"}
{"date": "2020-01-26", "time": "17:58:00.273073"}
Recommended Posts