【发布时间】:2018-03-16 16:36:15
【问题描述】:
我正在使用 python2.7 来检查服务是否正在运行。我做了自己的服务并将其放在/etc/init.d 中。我有一个覆盆子,我正在使用它。
现在要正常检查服务状态,我们可以这样做:
service my_service status
但是如何从 python 代码中获取服务状态。
谢谢
【问题讨论】:
标签: linux python-2.7
我正在使用 python2.7 来检查服务是否正在运行。我做了自己的服务并将其放在/etc/init.d 中。我有一个覆盆子,我正在使用它。
现在要正常检查服务状态,我们可以这样做:
service my_service status
但是如何从 python 代码中获取服务状态。
谢谢
【问题讨论】:
标签: linux python-2.7
我可能会迟到几年才能回答这个问题。但这是我找到的一个简单的解决方案
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.
【讨论】:
只需使用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
返回代码是从执行返回的代码。来自 service 手册页:
退出代码 服务调用初始化脚本并返回它返回的状态。
所以这取决于执行的初始化脚本。您可以放心地说除 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
【讨论】:
768。
768 表示服务未运行
0 表示正在运行,其他任何东西都没有运行。
这里有一点离题的答案(对于 python3)。
在 python3 中,您可以为此目的使用pystemd。它通过它的 dbus API 与 systemd 对话,所以它比仅仅执行 systemctl 并解析它的输出要好。
附: 最好使用subprocess 模块而不是使用os.system()。
【讨论】:
使用子进程:
import subprocess
stat = subprocess.call(["systemctl", "is-active", "--quiet", "ssh"])
if(stat == 0): # if 0 (active), print "Active"
print("Active")
另外,我发现 this answer 很好地解释了为什么使用 subprocess 而不是 os.system
【讨论】:
您可以查看我的代码以供参考:
#!/usr/bin/env python
import os
def isActive(daemon):
command = "systemctl is-active " + daemon + " > tmp"
os.system(command)
with open('tmp') as tmp:
tmp = tmp.read()
if "active" in tmp:
os.remove('tmp')
return 1
return 0
sshd = "sshd"
print(isActive(sshd))
【讨论】:
您需要做的第一件事是定义运行的含义:
然后写一些东西来执行你的测试或找到一个适合你的工具
【讨论】: