2012-07-26 80 views
0

我想讓子進程通過linux來運行hma代理。我是Python的新手,所以也許我沒有使用正確的方法。我需要做的是在後臺運行hma,並讓程序檢查我的公共IP是否與啓動程序前相同,並且是否每30分鐘不重新運行hma程序。hma的python子進程

基本上程序需要檢查當前IP然後連接到hma。如果第一個IP匹配第二個IP,即hma尚未連接,則打印等待。如果IP不匹配,則在30分鐘內再次運行hma。這是我迄今爲止的代碼。

import os 
import webbrowser 
import time 
import socket 
import urllib2 
import subprocess 

response = urllib2.urlopen("http://automation.whatismyip.com/n09230945.asp") 
internal = response.read() 
print "Internal IP Address is ", internal 
hma = ['cd', '/Desktop/hma', ';', './hma-start', '-r'] 
subprocess.Popen(hma, shell=True) 
response = urllib2.urlopen("http://automation.whatismyip.com/n09230945.asp") 
external = response.read() 
while (internal == external): 
    time.sleep(1) 
    response = urllib2.urlopen("http://automation.whatismyip.com/n09230945.asp") 
    external = response.read() 
    print 'waiting' 

while (internal != external): 
    print 'It changed' 
    hma = ['cd', '/Desktop/hma', ';', './hma-start', '-r'] 
    subprocess.Popen(hma, shell=True) 
    response = urllib2.urlopen("http://automation.whatismyip.com/n09230945.asp") 
    external = response.read() 

print "External IP Address is ", external 

我在做什麼錯了?對不起,如果這是完全錯誤的。我是新來的子模塊

回答

0

指定您想要加入的目錄。嗨,我不熟悉hma,但是應該這樣做。 如果不是dav1d,請確保hma-start在您的路徑中。我不太確定你爲什麼使用/ Desktop/hma?當你提高特權時,它應該不在哪裏。

import os 
import webbrowser 
import time 
import socket 
import urllib2 
import subprocess 
import socket 

URL = "http://automation.whatismyip.com/n09230945.asp" 
DIR = '/Desktop/hma' 
HMA = ['./hma-start', '-r'] 
WAIT_TIME = 60 * 30 # 30 min 
GET_IP = lambda: urllib2.urlopen(URL).read() 

if __name__ == '__main__': 
    external = internal = GET_IP() 
    print "Internal IP Address is %s" % internal 
    try: 
     os.chdir(DIR) 
    except OSError: 
     print "%s not found" % DIR 

    print "External IP Address is ", external 
    while True: 
     external = GET_IP() 
     if external != internal: 
      print "Proxied" 
      time.sleep(WAIT_TIME) 
     else: 
      print "Not Proxied" 
      proc = subprocess.Popen(HMA) 
      proc.wait() 
+0

這可以工作,但HMA完成連接後,它不會執行time.sleep(WAIT_TIME)。 – 2012-07-27 21:07:55

0

如果您使用shell=True您的命令行必須是一個字符串:

hma = 'cd /Desktop/hma; ./hma-start -r' 
subprocess.Popen(hma, shell=True) 

但你也可以做到這一點沒有shell=True

hma = ['/Desktop/hma/hma-start', '-r'] 
subprocess.Popen(hma) 

如果您要等到處理完成,請致電.communicate()Popen-Object

+0

如何使用Popen-Object? 當我使用 hma = ['/ Desktop/hma/hma-start','-r'] subprocess.Popen(hma) 我收到錯誤 – 2012-07-26 22:47:15

+0

哪個錯誤?通常你會這樣做:'p = Popen(...,stdout = PIPE,stderr = PIPE);'stdout,stderr = p.communicate()' – dav1d 2012-07-26 22:52:01

+0

我需要使用子進程的全部原因是因爲一旦啓動hma,不要讓其後的任何其他命令執行。 – 2012-07-26 22:53:57

0

嘗試subprocess.Popen('./hma-start -r', cwd='/root/Desktop/hma')如果在流程直接運行時不需要執行任何操作,則可以使用subprocess.call代替。 Popen返回一個對象。調用將調用子進程,然後您的python程序將等待進程完成,然後再繼續。
使用cd和子進程不能像在bash腳本中那樣工作。您需要使用cwd(當前工作目錄)關鍵字