2010-02-25 7 views
0

Я хочу, чтобы начать и остановить процесс NGREP изнутри моего кода на Python. У меня действительно нет опыта работы с python на системном уровне.Python и NGREP

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

Может ли кто-нибудь указать мне, как это сделать.

Кстати, мне действительно нужно иметь возможность делать захват пакетов, возможно, у Python есть встроенные возможности для этого, возможно, tcpdump?

Спасибо.

ответ

0

Ищите threading.Timer и pexpect. Если вы не хотите устанавливать pexpect, вместо этого вы можете использовать subprocess.Popen.

EDIT: В ответ на комментарий:

import os 
from signal import SIGTERM, SIGKILL 
os.kill(pid, SIGTERM) #you can also send SIGKILL instead of SIGTERM. 
#You might also have to put this call in a try block and catch OSError 
#Only available on *NIX 

EDIT2: Если вы хотите передать-ролл захвата пакетов, используйте pypcap. Это почти наверняка сделает то, что вы хотите, поскольку tcpdump использует сам libpcap.

+0

Я не уверен, почему threading.Timer был бы полезен в этом случае. – nosklo

+0

Потому что он хочет запускать его каждый час ... Итак, создайте 'threading.Timer (3600, runNgrep, args, kwargs)' для запуска программы и создания другого 'threading.Timer', когда программа закончится ... Где Очевидно, что 'runNgrep' - это функция, определяющая' args' и 'kwargs' как аргументы. –

+0

Это хорошие предложения. Любая идея, как убить процесс, хотя? Я вижу документы. кажется, что методы send_signal(), terminate() и exit() доступны только в python 2.6. Я запускаю python 2.5. Следуя вашему предложению, я использую subprocess.Popen, затем получите идентификатор процесса, а затем запустите subprocess.Popen с kill pid, чтобы обработать процесс. Не настолько элегантный, возможно, есть лучший способ прекратить процесс? – Dave

1

Я не эксперт, но я хотел бы сделать это:

import subprocess 
import sys 
import re 
import time 

keep_running = 1 #Loop flag 
wait_hours = 12 #Stop for 12 hours and then run again 
run_hours = 1 #We will run ngrep for an hour. The nth run will be dumped to net_log_n.txt 
f_num=0 
hours_so_far=0 
run_time_limit = 100 #Suppose you only want to take a log for 100 hours while you are away. 
while keep_running: 
    ngrep_cmd = "sudo ngrep -ixW > net_log_" + str(fnum) + ".txt &" 
    subprocess.call([ngrep_cmd], shell=True) 
    time.sleep(run_hours*3600) 
    subprocess.call(["sudo killall ngrep"], shell=True) 
    time.sleep(wait_hours*3600) 
    f_num += 1 
    hours_so_far += run_hours 
    if hours_so_far >= run_time_limit: 
     keep_running = 0 

Вы должны запустить его в качестве корня или с Судом.

Надеюсь, это поможет!

+0

Не нужно определять 'keep_running', если вы его никогда не меняете, просто используйте' while True: '. В строке 'os.system (sudo killall ngrep)' отсутствуют пропущенные кавычки, и вы должны * действительно * использовать 'subprocess.call' вместо этого. –

+0

Здравствуйте, Martijn, извините, я был неуклюжим с синтаксисом и благодарю за исправление! Я поставил 'keep_running' там, чтобы дать идею дополнительной строки 'if run_hours> 100: keep_running = 0', Dave. Я нахожусь в Mac OS 10.4.11, и у меня Python 2.3.5, поэтому я не думаю, что у меня есть доступ к модулю подпроцесса. – Vandalay

+0

Священные древние версии, Бэтмен! 2.3 действительно устарел. –

 Смежные вопросы

  • Нет связанных вопросов^_^