我想制作简单的 python 脚本,我可以在 cron 作业上运行它。我只想看看这些服务当前是否正在运行或停止
Httpd
mysql
我应该如何用python检查它们。
我需要解析的输出吗netstat -tlnp
我想制作简单的 python 脚本,我可以在 cron 作业上运行它。我只想看看这些服务当前是否正在运行或停止
Httpd
mysql
我应该如何用python检查它们。
我需要解析的输出吗netstat -tlnp
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 将是“活动的”,如果不是,则将是“非活动的”。
希望能帮助到你!!
使用 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
>>>
您可以使用 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!")
如果您使用 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')
如果您的服务已正确注册并支持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
是一个奖励,隐藏子进程的输出。我使用了 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")