4

我想制作简单的 python 脚本,我可以在 cron 作业上运行它。我只想看看这些服务当前是否正在运行或停止

Httpd
mysql

我应该如何用python检查它们。

我需要解析的输出吗netstat -tlnp

4

6 回答 6

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

这个 python 程序将检查服务是否正在运行,如果服务正在运行,putput 将是“活动的”,如果不是,则将是“非活动的”。

希望能帮助到你!!

于 2018-09-15T11:16:26.223 回答
5

使用 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
>>>
于 2013-07-09T06:30:32.427 回答
4

您可以使用 commands 模块来运行 ps shell 参数:

import commands
output = commands.getoutput('ps -A')
if 'Httpd' in output:
    print("Httpd is up an running!")

[编辑] 我刚刚阅读了 commands 模块,虽然工作正常,但它似乎从 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!")
于 2013-07-09T06:10:03.550 回答
4

如果您使用 subprocess 模块,您可以在不产生 shell 的情况下执行此操作,命令模块将执行此操作。(您可能不需要单独的外壳,这样做可能会带来一些安全问题)。

请注意,这也使您可以对错误采取行动(请参阅下面的 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

于 2013-07-09T06:20:57.623 回答
2

如果您的服务已正确注册并支持status报告(初始化脚本或新贵作业),请使用 linux 命令

service <name> status

如果服务正在运行,命令将返回退出代码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'
  • os.devnull是一个奖励,隐藏子进程的输出。
于 2017-04-25T07:20:28.913 回答
0

我使用了 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")
于 2020-05-06T14:47:51.913 回答