Ich wollte immer ein in Python geschriebenes Programm auf Sakuras VPS ausführen. Darüber hinaus ist es einfach, weil es mit systemctl betrieben werden kann. Die Methode ist wie folgt. Versuchen Sie, mit Systemd einen eigenen Befehl in einen Dienst zu verwandeln
How to
/opt/python_daemon.py
#!/usr/bin/env python
import time
import os
import sys
def main_unit():#Schreiben Sie die Zeit alle 10 Sekunden
while True:
filepath = '/opt/pydmon.log'
log_file = open(filepath,'a')
try:
log_file.write(time.ctime()+"\n")
finally:
log_file.close()
time.sleep(10)
def daemonize():
pid = os.fork()#Fork den Prozess hier
if pid > 0:#Für übergeordneten Prozess(pid ist die Prozess-ID des untergeordneten Prozesses)
pid_file = open('/var/run/python_daemon.pid','w')
pid_file.write(str(pid)+"\n")
pid_file.close()
sys.exit()
if pid == 0:#Für untergeordnete Prozesse
main_unit()
if __name__ == '__main__':
while True:
daemonize()
Fügen Sie am Anfang #! / Usr / bin / env python
oder #! / Usr / bin / python
hinzu.
#! / usr / bin / env python
scheint Python am Anfang von $ PATH
bevorzugt zu verwenden.
Andererseits scheint #! / Usr / bin / python
Python direkt unter / usr / bin / anzugeben.
Unannehmlichkeiten können auftreten, wenn die Version unterschiedlich ist.
Ich war mit dem Stapelüberlauf vertraut. Wenn Sie also interessiert sind, lesen Sie bitte. Why do people write #!/usr/bin/env python on the first line of a Python script?
daemonize ()
Beim Verzweigen des Prozesses schreibt der übergeordnete Prozess die in der Variablen pid zurückgegebene untergeordnete Prozess-ID in die PID-Datei und verschwindet.
Andererseits führt der untergeordnete Prozess alle 10 Sekunden main_unit ()
in einer Endlosschleife aus.
sudo chmod 755 /opt/python_daemon.py
Sie sollten jetzt die Ausführungsberechtigung haben.
/usr/lib/systemd/system/pythondaemon.service
[Unit]
Description=PythonDaemon
[Service]
ExecStart=/opt/python_daemon.py
Restart=always
Type=forking
PIDFile=/var/run/python_daemon.pid
[Install]
WantedBy=multi-user.target
Daemon-Definitionsdatei. Wenn ExecStart und PID-Datei übereinstimmen, ist das Kopieren und Einfügen meiner Meinung nach in Ordnung.
sudo systemctl daemon-reload
sudo systemctl start pythondaemon.service
Nach dem erneuten Laden des Daemons wird der neu erstellte pythondaemon.service
erkannt.
Dann starte es mit start
.
$ sudo systemctl status pythondaemon.service
● pythondaemon.service - PythonDaemon
Loaded: loaded (/usr/lib/systemd/system/pythondaemon.service; disabled; vendor preset: disabled)
Active: active (running)seit dem Monat 2017-09-11 00:35:12 JST; 10s ago
Process: 4633 ExecStart=/opt/python_daemon.py (code=exited, status=0/SUCCESS)
Main PID: 4634 (python)
CGroup: /system.slice/pythondaemon.service
└─4634 python /opt/python_daemon.py
Es bewegte sich!
pydmon.log sieht so aus
$ cat pydmon.log
Mon Sep 11 00:35:12 2017
Mon Sep 11 00:35:22 2017
Mon Sep 11 00:35:32 2017
Mon Sep 11 00:35:42 2017
Mon Sep 11 00:35:52 2017
Mon Sep 11 00:36:02 2017
Mon Sep 11 00:36:12 2017
Mon Sep 11 00:36:22 2017
Mon Sep 11 00:36:32 2017
Mon Sep 11 00:36:42 2017
Mon Sep 11 00:36:52 2017
Mon Sep 11 00:37:02 2017
Ich habe es genossen, weil es mit systemctl
verwaltet werden kann und ich von etwas beeindruckt bin
Recommended Posts