2012-07-24 38 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