我如何使python程序检查linux服务

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

Httpd mysql 

我应该如何检查他们与python。

我需要parsingnetstat -tlnp的输出

Solutions Collecting From Web of "我如何使python程序检查linux服务"

如果使用子进程模块,则可以在不产生命令模块将执行的shell的情况下执行此操作。 (你可能不需要一个单独的shell,这样做可能会有一些安全问题)。

请注意,这也使您有可能对错误采取行动(请参阅下面的错误变量),例如,您可以尝试重新启动已关闭的服务等。

 import subprocess p = subprocess.Popen(["ps", "-a"], stdout=subprocess.PIPE) out, err = p.communicate() if ('Httpd' in out): print('Httpd running') if ('mysql' in out): print('mysql running') 

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

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

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

我只是阅读了命令模块,虽然工作正常,但似乎从Python 2.6开始已被弃用,甚至在Python 3.x中被删除。 因此,如果您使用的是Python 3,或者想要为将来移植到Python 3做好准备,则可以使用子进程模块:

 import subprocess output = subprocess.check_output(['ps', '-A']) if 'Httpd' in output: print("Httpd is up an running!") 

使用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 >>> 

如果您的服务已正确注册并支持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是一个奖励,隐藏子进程的输出。