GNU/Linux >> Tutoriales Linux >  >> Linux

Código de Python para verificar si el servicio se está ejecutando o no.

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().


Linux
  1. [OpenStack-Devstack]:Error:el servicio n-net no se está ejecutando al ejecutar stack.sh

  2. ¿Verificar si el proceso está ejecutando Mac Os X y luego ejecutar el código?

  3. .bash_profile no se obtiene cuando se ejecuta Su?

  4. Comprobar los servicios en ejecución en Linux

  5. Servicio del sistema operativo Linux 'sshd'

Cómo comprobar la versión de Python

El servicio MongoDB no se ejecuta en Fedora

Comando de Linux para verificar si un script de shell se está ejecutando o no

Cómo verificar si un servicio en particular se está ejecutando en Ubuntu

¿Podemos usar código C en Python?

¿Complemento genérico de Nagios para comprobar si se está ejecutando un proceso/servicio específico?