GNU/Linux >> Linux Esercitazione >  >> Linux

Codice Python per verificare se il servizio è in esecuzione o meno.?

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


Linux
  1. Conversione del codice Python 2 in Python 3

  2. Cron Job per verificare se lo script PHP è in esecuzione, in caso contrario eseguito?

  3. Controlla i servizi in esecuzione su Linux

  4. Servizio del sistema operativo Linux 'sshd'

  5. systemctl:comando non trovato

Come controllare la versione di Python

Servizio MongoDB non in esecuzione in Fedora

Comando Linux per verificare se uno script di shell è in esecuzione o meno

Come verificare se un particolare servizio è in esecuzione su Ubuntu

Possiamo usare il codice C in Python?

Plugin Nagios generico per verificare se un processo/servizio specifico è in esecuzione?