Как я могу заставить программу python проверять службы linux?

Я хочу сделать простой скрипт python, который я могу запустить на работу cron. я просто хочу посмотреть, работают ли эти службы в настоящее время или остановлены

Httpd mysql 

Как я должен проверить их с помощью python.

Мне нужно проанализировать вывод netstat -tlnp

4 Solutions collect form web for “Как я могу заставить программу python проверять службы linux?”

Если вы используете модуль подпроцесса, вы можете это сделать, не создавая оболочку, которую будет выполнять командный модуль. (Для этого вам, вероятно, не нужна отдельная оболочка, и при этом могут возникнуть некоторые проблемы с безопасностью).

Обратите внимание, что это также дает вам возможность воздействовать на ошибки (см. Переменную err ниже), например, вы можете попробовать перезапустить службы, которые недоступны и т. Д.

 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!") 

[edit] Я только что прочитал модуль команд, и хотя он работает нормально, он, кажется, устарел с 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 – это бонус, чтобы скрыть вывод дочернего процесса.
  • Установить Twisted в python не удалось с помощью «Нет такого файла»,
  • Зачем использовать методы модуля os для Python вместо выполнения команд оболочки напрямую?
  • Обфускация строк в Python
  • Как заставить скрипт Python работать как служба или демон в Linux
  • Использование памяти многопроцессорной обработки Python
  • numpy.memmap: выделение фиктивной памяти
  • Как я могу «посмотреть» файл для изменения / изменения?
  • Размер буфера по умолчанию для файла в Linux
  • Python - лучший язык программирования в мире.