2012-07-24 75 views
0

我正在尋找一個封裝腳本來運行一個程序,該程序通過SSH命令遠程調用,該程序在不等待程序結果的情況下終止。Python封裝腳本讓程序遠程執行,無阻塞

這裏是我的代碼:

#!/usr/bin/python 

import sys 
import os, subprocess 

def main(): 
    print "PID_last_child", os.getpid() 
    argpass = ['main_p.py'] 
    for a in sys.argv: 
     if a.find("wrapper.py") == -1: 
      argpass.append(a) 
    pid = subprocess.Popen(argpass).pid 
    print "PID for the actual process: ", pid 


if __name__ == "__main__": 

    print "PID_MAIN:", os.getpid() 

    try: 
     pid = os.fork() 
     print "FORK1: ", pid 
     if pid > 0: 
       sys.exit(0) 
    except OSError, e: 
     print >>sys.stderr, "fork failed: %d (%s)" % (e.errno, e.strerror) 
     sys.exit(1) 

    os.chdir('/') 
    os.setsid() 
    os.umask(0) 

    try: 
     pid = os.fork() 
     print "FORK2: ", pid 
     if pid > 0: 
       sys.exit(0) 
    except OSError, e: 
     print >>sys.stderr, "fork failed: %d (%s)" % (e.errno, e.strerror) 
     sys.exit(1) 

    main() 

我想用雙分叉,我應該能夠做到這一點......但至今沒有運氣。

對此的任何想法,不勝感激。

+0

你不能在shell腳本中使用'&'嗎? – Neil 2012-07-24 23:55:15

+0

您的縮進不正確。你能再檢查一次嗎? – 2012-07-24 23:56:41

+0

不是真的......我寧願用一個包裝腳本來處理它...... – Amir 2012-07-24 23:56:42

回答

1

我完全歸功於在bash語法該鏈接的答案:How to starting process as daemon using ssh command?

你甚至都不需要雙叉。問題是stdout仍然連接。這裏是Python的方法:

wrapper.py

import subprocess 
import os 

def main(): 
    pid = subprocess.Popen(['nohup', '/path/to/main_p.py'], 
          stdout = open(os.devnull, 'w+', 0), 
          stderr = subprocess.STDOUT 
          ).pid 
    print pid 

if __name__ == "__main__": 

    main() 

然後ssh命令會調用這個包裝:

ssh server /path/to/wrapper.py 

你只需將stdout - > devull,和該過程將立即返回。

+0

正如我所說,我不能那樣做......我無法控制ssh盒子。 – Amir 2012-07-25 00:55:30

+0

@AmirReza:這是在ssh命令調用的腳本中,而不是ssh命令本身。你的ssh命令執行這個啓動你的實際進程。 – jdi 2012-07-25 00:59:15

+0

我的意思是,我的ssh系列中沒有「2&1&」。 ssh行是「ssh server wrapper.py」 – Amir 2012-07-25 01:16:22