如何让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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-07 00:11:50  来源:igfitidea点击:

How can i make the python program to check linux services

pythonlinuxnetwork-programmingcentos

提问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')

http://docs.python.org/2/library/subprocess.html

http://docs.python.org/2/library/subprocess.html

回答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 statusreporting (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.devnullis 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")