用于检查服务是否正在运行的Python代码。

S A*_*rew 1 linux python-2.7

我正在使用python2.7检查服务是否正在运行。我已经做了自己的服务,并将其放置在内部/etc/init.d。我有一个正在使用的树莓。

现在,要正常检查服务状态,我们可以执行以下操作:

service my_service status
Run Code Online (Sandbox Code Playgroud)

但是如何从python代码获取服务状态。

谢谢

Dyl*_*tra 22

我可能要晚几年才能回答这个问题..但这是我找到的一个简单的解决方案

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.
Run Code Online (Sandbox Code Playgroud)


luc*_*crp 9

使用子进程:

import subprocess

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

另外,我发现这个答案很好地解释了为什么使用 subprocess 而不是 os.system


Gra*_*dma 7

这里有点离题的答案(对于python3)。

在 python3 中,您可以为此使用pystemd。它通过它的 dbus API 与 systemd 对话,所以它比仅仅执行systemctl和解析它的输出要好。

PS 最好使用进程模块而不是使用 os.system()。


Che*_* A. 6

只需使用os.system()即可。然后,您将获得执行的返回码。0表示正在运行,768已停止

>>> 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
Run Code Online (Sandbox Code Playgroud)

返回代码是从执行中返回的代码。从服务手册页:

EXIT CODES服务调用初始化脚本并返回其返回的状态。

因此,这取决于执行的初始化脚本。您可以放心地说,任何非0的返回码都表示该服务未运行。

您可以使用以下方法检查进程是否正在运行

>>> os.system('ps aux | grep sshd | grep -v grep | wc -l')
2
>>> os.system('ps aux | grep sshd123 | grep -v grep | wc -l')
0
Run Code Online (Sandbox Code Playgroud)