So registrieren Sie einen Python-Job in cron und führen ihn regelmäßig in einer venv-Umgebung aus
Sie können Python in der Venv-Umgebung verwenden, die Sie verwenden möchten.
$ crontab -e
* * * * * cd [Absoluter Pfad]; venv/bin/python foo.py
Ich möchte Datum und Uhrzeit einmal pro Minute in eine Datei im jsonline-Format schreiben.
Betriebssystemumgebung
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G87
Erstellen Sie ein Verzeichnis, erstellen Sie eine virtuelle venv-Umgebung und installieren Sie das diesmal verwendete Paket jsonlines.
$ mkdir [Ort]
$ cd [Ort]
$ python -V
Python 3.7.1
$ python -m venv venv
$ source venv/bin/activate
(venv) $ pip install jsonlines
Schreiben Sie ein Python-Skript. Das Datum und die Uhrzeit der Verarbeitung werden als jsonline in out.jsonl geschrieben. Zur Bestätigung auch ausdrucken.
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))
Bei der Verarbeitung sieht die Ausgabe folgendermaßen aus.
(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"}
Versuchen Sie, sich bei cron als python dt2jsonl.py
zu registrieren. Da es sich um "* * * * *" handelt, sollte es einmal pro Minute verarbeitet werden.
Schreiben Sie stderr und stdout mit >> /tmp/cron.log 2> & 1
in /tmp/cron.log, um den Fehler zu überprüfen und das Ergebnis zu drucken.
(venv) $ crontab -e
* * * * * python dt2jsonl.py >> /tmp/cron.log 2>&1
Beim Warten tritt ein Fehler in "/ tmp / cron.log" auf
(venv) $ tail -f /tmp/cron.log
python: can't open file 'dt2jsonl.py': [Errno 2] No such file or directory
Es scheint, dass dt2jsonl.py
nicht gefunden werden kann. Überprüfen Sie also, wo sich der Cron befindet.
(venv) $ crontab -e
* * * * * pwd >> /tmp/cron.log 2>&1
(venv) $ tail -f /tmp/cron.log
/Users/[Nutzer]
Da Sie sich im Benutzerverzeichnis befinden, werde ich Ihnen den absoluten Pfad des Skripts mitteilen.
(venv) $ crontab -e
* * * * * python /Users/[Nutzer]/[Ort]/dt2jsonl.py >> /tmp/cron.log 2>&1
(venv) $ tail -f /tmp/cron.log
Traceback (most recent call last):
File "/Users/[Nutzer]/[Ort]/dt2jsonl.py", line 2, in <module>
import jsonlines
ImportError: No module named jsonlines
Diesmal bin ich zum Python-Skript gekommen, aber ohne jsonlines. Überprüfen Sie, welche Python von Cron verwendet wird, da sie nicht in der venv-Umgebung ausgeführt wird.
(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
Ich verwende das System python2.7, also sollte ich etwas dagegen tun. Überprüfen Sie, welche Python verwendet werden soll.
(venv) $ which python
/Users/[Nutzer]/[Ort]/venv/bin/python
Schreiben Sie unter venv zu Python um.
(venv) $ crontab -e
* * * * * /Users/[Nutzer]/[Ort]/venv/bin/python /Users/[Nutzer]/[Ort]/dt2jsonl.py >> /tmp/cron.log 2>&1
Nach einer kurzen Wartezeit erhielt ich das Druckergebnis in / 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"}
Ich dachte, dass es auch als jsonline in out.jsonl geschrieben wurde, aber es wurde am Anfang manuell ausgeführt, nicht das Ergebnis der Ausführung mit cron. Es befand sich im Benutzerverzeichnis, da es im Benutzerverzeichnis ausgeführt wurde.
(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"}
Die Position der Ausgabe ist unterschiedlich, aber Cron hat sie in der Venv-Umgebung gehandhabt. Es ist gut, die Ausgabe des Python-Skripts mit einem absoluten Pfad anzugeben. Ändern Sie dieses Mal das Ausführungsverzeichnis von cron.
(venv) $ crontab -e
* * * * * cd /Users/[Nutzer]/[Ort]; venv/bin/python dt2jsonl.py >> /tmp/cron.log 2>&1
Das habe ich erwartet.
(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"}
Warte eine 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