如何让python程序检查linux服务
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17541044/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can i make the python program to check linux services
提问by user2424160
I want to make simple python script , which i can run on cron job. i just want to see if these services are currently running or stopped
我想制作简单的 python 脚本,我可以在 cron 作业上运行它。我只想看看这些服务当前是在运行还是已停止
Httpd
mysql
How should i check them with python.
我应该如何用python检查它们。
Do i need to parse the output of netstat -tlnp
我需要解析输出吗 netstat -tlnp
回答by kramer65
You could use the commands module to run the ps shell argument:
您可以使用命令模块来运行 ps shell 参数:
import commands
output = commands.getoutput('ps -A')
if 'Httpd' in output:
print("Httpd is up an running!")
[edit] I just read up on the commands module, and although working fine, it seems to be deprecated since Python 2.6 and even removed in Python 3.x. So if you are on Python 3 or want to be ready for future porting to Python 3, you can use the subprocess module:
[编辑] 我刚刚阅读了命令模块,虽然工作正常,但它似乎自 Python 2.6 以来已被弃用,甚至在 Python 3.x 中被删除。因此,如果您使用的是 Python 3 或希望为将来移植到 Python 3 做好准备,您可以使用 subprocess 模块:
import subprocess
output = subprocess.check_output(['ps', '-A'])
if 'Httpd' in output:
print("Httpd is up an running!")
回答by nic
If you use the subprocess module you can do this without spawning a shell, which the command module will do. (You probably don't need a separate shell for this and there might be some security concerns by doing so).
如果您使用 subprocess 模块,您可以在不生成 shell 的情况下执行此操作,而命令模块将执行此操作。(您可能不需要为此使用单独的 shell,这样做可能会有一些安全问题)。
Note that this also gives you possibility to act on errors (see the err variable below), for example you can try to restart services that are down etc.
请注意,这也使您可以对错误采取行动(请参阅下面的 err 变量),例如,您可以尝试重新启动已关闭的服务等。
import subprocess
p = subprocess.Popen(["ps", "-a"], stdout=subprocess.PIPE)
out, err = p.communicate()
if ('Httpd' in str(out)):
print('Httpd running')
if ('mysql' in str(out)):
print('mysql running')
回答by Abhishek Kulkarni
Use psutils class. Its fantastic and cross platform.. Following are the functional usage..
使用 psutils 类。它的奇妙和跨平台..以下是功能用法..
import psutil
>>> psutil.get_pid_list()
[1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224,
268, 1215, 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355,
2637, 2774, 3932, 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245,
4263, 4282, 4306, 4311, 4312, 4313, 4314, 4337, 4339, 4357, 4358,
4363, 4383, 4395, 4408, 4433, 4443, 4445, 4446, 5167, 5234, 5235,
5252, 5318, 5424, 5644, 6987, 7054, 7055, 7071]
>>>
>>> p = psutil.Process(7055)
>>> p.name
'python'
>>> p.exe
'/usr/bin/python'
>>> p.getcwd()
'/home/giampaolo'
>>> p.cmdline
['/usr/bin/python', 'main.py']
>>>
>>> str(p.status)
'running'
>>> p.username
'giampaolo'
>>> p.create_time
1267551141.5019531
>>> p.terminal
'/dev/pts/0'
>>>
>>> p.uids
user(real=1000, effective=1000, saved=1000)
>>> p.gids
group(real=1000, effective=1000, saved=1000)
>>>
>>> p.get_cpu_times()
cputimes(user=1.02, system=0.31)
>>> p.get_cpu_percent(interval=1.0)
12.1
>>> p.get_cpu_affinity()
[0, 1, 2, 3]
>>> p.set_cpu_affinity([0])
>>>
>>> p.get_memory_percent()
0.63423
>>> p.get_memory_info()
meminfo(rss=7471104, vms=68513792)
>>> p.get_ext_memory_info()
meminfo(rss=9662464, vms=49192960, shared=3612672, text=2564096, lib=0,
data=5754880,dirty=0)
>>> p.get_memory_maps()
[mmap(path='/lib/x86_64-linux-gnu/libutil-2.15.so', rss=16384, anonymous=8192, swap=0),
mmap(path='/lib/x86_64-linux-gnu/libc-2.15.so', rss=6384, anonymous=15, swap=0),
mmap(path='/lib/x86_64-linux-gnu/libcrypto.so.1.0.0', rss=34124, anonymous=1245,
swap=0),
mmap(path='[heap]', rss=54653, anonymous=8192, swap=0),
mmap(path='[stack]', rss=1542, anonymous=166, swap=0),
...]
>>>
>>> p.get_io_counters()
io(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632)
>>>
>>> p.get_open_files()
[openfile(path='/home/giampaolo/svn/psutil/somefile', fd=3)]
>>>
>>> p.get_connections()
[connection(fd=115, family=2, type=1, local_address=('10.0.0.1', 48776),
remote_address=('93.186.135.91', 80), status='ESTABLISHED'),
connection(fd=117, family=2, type=1, local_address=('10.0.0.1', 43761),
remote_address=('72.14.234.100', 80), status='CLOSING'),
connection(fd=119, family=2, type=1, local_address=('10.0.0.1', 60759),
remote_address=('72.14.234.104', 80), status='ESTABLISHED'),
connection(fd=123, family=2, type=1, local_address=('10.0.0.1', 51314),
remote_address=('72.14.234.83', 443), status='SYN_SENT')]
>>>
>>> p.get_num_threads()
4
>>> p.get_num_fds()
8
>>> p.get_num_ctx_switches()
amount(voluntary=78, involuntary=19)
>>>
>>> p.get_threads()
[thread(id=5234, user_time=22.5, system_time=9.2891),
thread(id=5235, user_time=0.0, system_time=0.0),
thread(id=5236, user_time=0.0, system_time=0.0),
thread(id=5237, user_time=0.0707, system_time=1.1)]
>>>
>>> p.get_nice()
0
>>> p.set_nice(10)
>>>
>>> p.suspend()
>>> p.resume()
>>>
>>> p.terminate()
>>> p.wait(timeout=3)
0
>>>
>>> psutil.test()
USER PID %CPU %MEM VSZ RSS TTY START TIME COMMAND
root 1 0.0 0.0 24584 2240 ? Jun17 00:00 init
root 2 0.0 0.0 0 0 ? Jun17 00:00 kthreadd
root 3 0.0 0.0 0 0 ? Jun17 00:05 ksoftirqd/0
...
giampaolo 31475 0.0 0.0 20760 3024 /dev/pts/0 Jun19 00:00 python2.4
giampaolo 31721 0.0 2.2 773060 181896 ? 00:04 10:30 chrome
root 31763 0.0 0.0 0 0 ? 00:05 00:00 kworker/0:1
>>>
回答by Jossef Harush
If your services are properly registered and support status
reporting (init script or upstart job), Use the linux command
如果您的服务已正确注册并支持status
报告(init 脚本或 upstart 作业),请使用 linux 命令
service <name> status
If the service is running, command will return exit code 0
如果服务正在运行,命令将返回退出代码 0
import os
import subprocess
def is_service_running(name):
with open(os.devnull, 'wb') as hide_output:
exit_code = subprocess.Popen(['service', name, 'status'], stdout=hide_output, stderr=hide_output).wait()
return exit_code == 0
if not is_service_running('mysql'):
print 'mysql is not running'
- the
os.devnull
is a bonus, to hide the output of the child process.
- 这
os.devnull
是一个奖励,隐藏子进程的输出。
回答by Falcon Ryu
import subprocess
service = "apache2"
p = subprocess.Popen(["systemctl", "is-active", service], stdout=subprocess.PIPE)
(output, err) = p.communicate()
output = output.decode('utf-8')
print(output)
This python program will check if the service is running the putput will be "active" if the service is running and "inactive" if not.
这个python程序将检查服务是否正在运行,如果服务正在运行,putput将是“活动的”,如果不是,则“不活动”。
Hope it helps!!
希望能帮助到你!!
回答by Michelone
i used the code of Jossef and I added some features
我使用了Jossef的代码并添加了一些功能
Thanks so Much Jossef
非常感谢约瑟夫
import subprocess
import os
import subprocess
import requests
def is_service_running(name):
with open(os.devnull, 'wb') as hide_output:
exit_code = subprocess.Popen(['service', name, 'status'], stdout=hide_output, stderr=hide_output).wait()
return exit_code == 0
# CLASS SLACK TO SEND NOTIFICATION
class Slack:
def __init__(self,report):
webhook = 'https://hooks.slack.com/services/T92JCJW59/B012Qxxxxxxxxxxxxxxxxxxxxxxx'
response = requests.post(webhook, json=report, headers={'Content-Type': 'application/json'})
if response.ok:
json_data = response.text
self.result = json_data
if __name__ == '__main__':
if not is_service_running('mysqld'):
print ('mysql is not running')
os.system("systemctl restart mysqld")
result_dict = ("*MICHELONE SLACK* \n*MYSQL DOWN IM GOING TO RESTART* ")
slack_report = {"attachments": [{"fallback": "*MICHELONE SLACK*", "color": "#FF0000", "text": result_dict}]}
slack_push_log = Slack(slack_report)
else:
print("ALL OK")
if not is_service_running('httpd'):
print('httpd is not running')
os.system("systemctl restart httpd")
result_dict = ("*MICHELONE SLACK* \n*APACHE DOWN IM GOING TO RESTART* ")
slack_report = {"attachments": [{"fallback": "*MICHELONE SLACK*", "color": "#FF0000", "text": result_dict}]}
slack_push_log = Slack(slack_report)
else:
print("ALL OK")