2013-08-01 46 views
0

我正在嘗試自動化 Linux Agent計算機的啓動過程。我需要運行位於兩個不同目錄中的兩個可執行文件,並將控制權交還給提示,以便繼續執行其他任務,例如執行grep以檢查兩個進程是否仍在運行。下面是在我試圖做這兩種不同的方式使用Python:執行2個阻塞進程並需要在同一個ssh會話中返回控制

代碼片段:(通過派生一個子進程)

import os 
import pdb 

    def child(): 

    cwd = os.getcwd() 
    os.chdir("THoT") 
    os.chdir("TH_Node") 
    print "Executing TH_Node.exe........." 
    command = "mono TH_Node.exe" 
    os.system(command) 
    os._exit(0) 

    def parent(): 

    i = 0 
     while i < 1: 
     i = i + 1 
     newpid = os.fork() 
     if newpid == 0: 
     child() 
     else: 
     cwd = os.getcwd() 
     os.chdir("THoT") 
     os.chdir("TH_Protocol") 
     print "Executing TH_Protocol.exe........." 
     command1 = "mono TH_Protocol.exe" 
     os.system(command1)   

    parent() 

代碼片斷2:(採用多處理)

import multiprocessing 
import time 
import sys 
import os 
import pdb 

def TH_Protocol(): 

os.chdir("THoT") 
os.chdir("TH_Protocol") 
command = "mono TH_Protocol.exe" 
os.system(command) 


def TH_Node(): 

os.chdir("THoT") 
os.chdir("TH_Node") 
command1 = "mono TH_Node.exe" 
os.system(command1) 


if __name__ == '__main__': 
     d = multiprocessing.Process(name='TH_Protocol', target=TH_Protocol) 
     d.TH_Protocol = True 

     n = multiprocessing.Process(name='TH_Node', target=TH_Node) 
     n.TH_Protocol = False 

     d.start() 
     n.start() 
     d.join(1) 
     n.join() 

問題是雖然我同時運行TH_Protocol.exe和TH_Node.exe進程,但我需要ssh到另一個會話來運行grep命令來檢查這兩個進程是否正在運行。我需要將控制返回到與運行我的python腳本的會話相同的會話中。我試圖使用subprocess.Popen,但我面臨同樣的問題。有什麼辦法可以解決這個問題嗎?

+0

聽起來你只是想要(a)在你的ssh會話的後臺運行這個腳本,或者(b)有一個線程或進程以某種方式響應你,而另一個線程正在等待兩個後臺進程。這些都是微不足道的,但我不知道你想要哪一個。 – abarnert

+0

另外,請修復您的格式。閱讀所有在同一級別縮進的代碼是非常困難的 - 有時這會掩蓋你希望人們修復的錯誤。 – abarnert

回答

0

如果你只是想在後臺運行這個腳本,並在運行時控制你的ssh會話......這與Python或ssh無關,它是基本的shell作業控制。

例如,假設在遠程機器上你的shell是SH/bash的/相似的,而不是這樣的:

remote_machine$ python script.py 

...這樣做:

remote_machine$ python script.py & 
[1] 55341 
remote_machine$ 

現在你已經得到了提示背部。您可以使用%1或PID 55341與主要解釋程序進行交互。它終於完成後,下一個提示你會顯示這樣的事情:

[1]+ Done python 

不能直接與兩個孩子處理此方式進行交互。如果你願意,你可以隨時使用grep,或者搜索PID 55341的子進程,但是如果你的子進程在啓動時做了類似print('TH_Protocol on {}'.format(os.getpid()))的處理,你可能會覺得你的生活更輕鬆,所以你不必去做。

相關問題