Potrei essere in ritardo di qualche anno per rispondere a questa domanda... ma ecco una soluzione semplice che ho trovato
import os # I think it's better to use subprocess for this. but quick code for example
status = os.system('systemctl is-active --quiet service-name')
print(status) # will return 0 for active else inactive.
Semplicemente usando os.system(). Si ottiene quindi il codice di ritorno dell'esecuzione; 0 significa correre, 768 interrotto
>>> import os
>>> stat = os.system('service sshd status')
Redirecting to /bin/systemctl status sshd.service
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2017-10-05 09:35:14 IDT; 29s ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 620 ExecStart=/usr/sbin/sshd $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 634 (sshd)
CGroup: /system.slice/sshd.service
└─634 /usr/sbin/sshd
>>> stat
0 <-- means service is running
>>> os.system('service sshd stop')
Redirecting to /bin/systemctl stop sshd.service
0 <-- command succeeded
>>> os.system('service sshd status')
Redirecting to /bin/systemctl status sshd.service
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Thu 2017-10-05 09:41:58 IDT; 10s ago
Docs: man:sshd(8)
...
768 <-- service not running
Il codice di ritorno è quello restituito dall'esecuzione. Dal servizio manpage:
Il servizio CODICI DI USCITA chiama lo script init e restituisce lo stato da esso restituito.
Quindi dipende dallo script init eseguito. Puoi tranquillamente affermare che qualsiasi codice di ritorno diverso da 0 indica che il servizio non è in esecuzione.
Puoi invece controllare se il processo è in esecuzione utilizzando:
>>> os.system('ps aux | grep sshd | grep -v grep | wc -l')
2
>>> os.system('ps aux | grep sshd123 | grep -v grep | wc -l')
0
Utilizzo del sottoprocesso :
import subprocess
stat = subprocess.call(["systemctl", "is-active", "--quiet", "ssh"])
if(stat == 0): # if 0 (active), print "Active"
print("Active")
Inoltre, ho trovato questa risposta che spiega bene perché usare subprocess invece di os.system
Risposta un po' fuori tema qui (per python3).
In python3 puoi usare pystemd per questo scopo. Comunica con systemd tramite la sua API dbus, quindi è meglio che eseguire semplicemente systemctl
e analizzando il suo output.
P.S. È meglio usare il modulo subprocess invece di usare os.system().