GNU/Linux >> Znalost Linux >  >> Linux

Python kód pro kontrolu, zda služba běží nebo ne.?

Možná se o pár let zpozdím, abych na to odpověděl, ale tady je snadné řešení, které jsem našel

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.

Jednoduše pomocí os.system(). Poté získáte návratový kód provedení; 0 znamená běh, 768 zastaveno

>>> 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

Návratový kód je ten, který se vrátil z provádění. Ze služby manuálová stránka:

EXIT CODESservice volá init skript a vrací jím vrácený stav.

Záleží tedy na provedeném init skriptu. Můžete bezpečně říci, že jakýkoli návratový kód jiný než 0 znamená, že služba není spuštěna.

Můžete buď zkontrolovat, zda proces místo toho běží pomocí:

>>> os.system('ps aux | grep sshd | grep -v grep | wc -l')
2
>>> os.system('ps aux | grep sshd123 | grep -v grep | wc -l')
0

Použití podprocesu :

import subprocess

stat = subprocess.call(["systemctl", "is-active", "--quiet", "ssh"])
if(stat == 0):  # if 0 (active), print "Active"
    print("Active")

Také jsem našel tuto odpověď, která dobře vysvětluje, proč používat subprocess místo os.system


Trochu mimo téma odpověď zde (pro python3).

V python3 můžete pro tento účel použít pystemd. Se systemd komunikuje přes jeho dbus API, takže je to lepší než jen spouštět systemctl a analyzovat jeho výstup.

P.S. Je lepší použít modul subprocess namísto použití os.system().


Linux
  1. Převod kódu Python 2 na Python 3

  2. Zkontrolujte, zda proces běží na Mac OS X, a poté spustit kód?

  3. .bash_profile není při spuštění Su?

  1. Jak zkontrolovat průběh běhu Cp?

  2. systemctl:příkaz nenalezen

  3. Jak zkontrolovat, zda proces stále běží pomocí Pythonu na Linuxu?

  1. Příkaz Linux pro kontrolu, zda je spuštěn skript shellu nebo ne

  2. Jak zkontrolovat, zda konkrétní služba běží na Ubuntu

  3. Můžeme použít C kód v Pythonu?