2010-02-25 3 views
0

내 파이썬 코드 내부에서 NGREP 프로세스를 시작하고 중지 할 수 있기를 원합니다. 필자는 시스템 레벨에서 파이썬에 대한 경험이 없다.Python 및 NGREP

일반적으로 명령 줄에서 NGREP를 실행하지만 매 시간마다 스크립트에서 실행하여 추적을 캡처 한 다음 결과를 처리 할 수 ​​있기를 원합니다.

누구든지이 목표를 달성하는 방법을 알려줄 수 있습니까?

그건 그렇고, 필자는 패킷 캡처를 할 수 있어야합니다. 아마 파이썬에는이 기능이 내장되어 있습니다. 아마도 tcpdump일까요?

감사합니다.

답변

0

찾아보기 threading.Timerpexpect. pexpect를 설치하지 않으려면 대신 subprocess.Popen을 사용할 수 있습니다.

편집 : 주석 님의 질문에 답변

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

그는 1 시간마다 실행하기를 원하기 때문에 ... 프로그램을 실행하고 프로그램이 완료되면 또 다른'threading.Timer'를 만들기 위해'threading.Timer (3600, runNgrep, args, kwargs)'를 작성하십시오. 'runNgrep'은 args와'kwargs'를 인자로 취하는 함수입니다. –

+0

다음은 좋은 제안입니다. 어떤 생각을 어떻게 프로세스를 죽일 생각? 나는 문서를 본다. 그것은 send_signal(), terminate() 및 exit() 메소드가 파이썬 2.6에서만 사용 가능한 것처럼 보입니다. 파이썬 2.5를 실행 중입니다. 귀하의 제안에 따라, 나는 subprocess.Popen을 사용하여 프로세스 ID를 얻은 다음 프로세스를 종료하기 위해 kill pid로 subprocess.Popen을 실행합니다. 매우 우아하지는 않습니다. 아마 프로세스를 종료하는 더 좋은 방법이 있을까요? – 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 

당신은 루트로 또는 sudo를 함께 실행해야합니다.

도움이 되었기를 바랍니다.

+0

'keep_running'을 절대 변경하지 않는다면 정의 할 필요가 없습니다. 단지'while True :'를 사용하십시오. 귀하의'os.system (sudo killall ngrep)'행에 따옴표가 없으므로 대신 * subprocess.call을 사용해야합니다. –

+0

안녕 Martijn, 미안 구문에 대한 서투른 및 수정 주셔서 감사합니다! Dave에게 'run_hours> 100 : keep_running = 0'이라면 'keep_running'옵션 라인을 추가 할 수 있습니다. 나는 Mac OS 10.4.11이고 Python 2.3.5를 가지고 있으므로 하위 모듈에 액세스 할 수 없다고 생각합니다. – Vandalay

+0

거룩한 고대 버전, 배트맨! 2.3은 실제로 구식입니다. –