GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Python-Code, um zu überprüfen, ob der Dienst ausgeführt wird oder nicht.?

Ich bin vielleicht ein paar Jahre zu spät, um darauf zu antworten, aber hier ist eine einfache Lösung, die ich gefunden habe

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.

Einfach mit os.system(). Sie erhalten dann den Rückgabecode der Ausführung; 0 bedeutet Laufen, 768 angehalten

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

Der Rückgabecode ist derjenige, der von der Ausführung zurückgegeben wird. Vom Dienst Handbuchseite:

EXIT CODESservice ruft das Init-Skript auf und gibt den von ihm zurückgegebenen Status zurück.

Es liegt also am ausgeführten Init-Skript. Sie können sicher sagen, dass jeder andere Rückgabecode als 0 bedeutet, dass der Dienst nicht ausgeführt wird.

Sie können entweder prüfen, ob der Prozess stattdessen ausgeführt wird mit:

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

Unterprozess verwenden :

import subprocess

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

Außerdem habe ich diese Antwort gefunden, die gut erklärt, warum subprocess anstelle von os.system

verwendet wird

Etwas Off-Topic-Antwort hier (für python3).

In Python3 können Sie zu diesem Zweck pystemd verwenden. Es kommuniziert mit systemd über seine dbus-API, also ist es besser, als nur systemctl auszuführen und parsen der Ausgabe.

P.S.Es ist besser, das Unterprozessmodul zu verwenden, anstatt os.system() zu verwenden.


Linux
  1. Konvertieren Ihres Python 2-Codes in Python 3

  2. [OpenStack-Devstack]:Fehler:Dienst n-net läuft nicht, wenn stack.sh ausgeführt wird

  3. .bash_profile nicht bezogen, wenn Su ausgeführt wird?

  4. Wie überprüfe ich den Fortschritt des Laufens von Cp?

  5. Überprüfen Sie die laufenden Dienste unter Linux

So überprüfen Sie die Python-Version

Wie kann ich mit Python unter Linux überprüfen, ob ein Prozess noch läuft?

MongoDB-Dienst läuft nicht in Fedora

So überprüfen Sie, ob ein bestimmter Dienst unter Ubuntu ausgeführt wird

Können wir C-Code in Python verwenden?

Generisches Nagios-Plugin, um zu überprüfen, ob ein bestimmter Prozess/Dienst ausgeführt wird?