Puede que me retrase unos años para responder a esto... pero he encontrado una solución fácil
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.
Simplemente usando os.system(). Luego obtiene el código de retorno de la ejecución; 0 significa correr, 768 detenido
>>> 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
El código de retorno es el que devuelve la ejecución. Desde el servicio página de manual:
EXIT CODESservice llama al script de inicio y devuelve el estado devuelto por este.
Entonces depende del script de inicio ejecutado. Puede decir con seguridad que cualquier código de retorno que no sea 0 significa que el servicio no se está ejecutando.
Puede verificar si el proceso se está ejecutando en su lugar usando:
>>> os.system('ps aux | grep sshd | grep -v grep | wc -l')
2
>>> os.system('ps aux | grep sshd123 | grep -v grep | wc -l')
0
Usando subproceso:
import subprocess
stat = subprocess.call(["systemctl", "is-active", "--quiet", "ssh"])
if(stat == 0): # if 0 (active), print "Active"
print("Active")
Además, encontré esta respuesta que explica bien por qué usar subproceso en lugar de os.system
Respuesta un poco fuera de tema aquí (para python3).
En python3 puede usar pystemd para este propósito. Habla con systemd a través de su API dbus, por lo que es mejor que simplemente ejecutar systemctl
y analizando su salida.
P.S.Es mejor usar el módulo de subproceso en lugar de usar os.system().