Python包装器脚本,让程序可以无阻塞地远程执行
我正在寻找一个包装脚本来运行一个程序,该程序由SSH命令远程调用,该命令在不等待程序结果的情况下终止 这是我的密码:Python包装器脚本,让程序可以无阻塞地远程执行,python,fork,Python,Fork,我正在寻找一个包装脚本来运行一个程序,该程序由SSH命令远程调用,该命令在不等待程序结果的情况下终止 这是我的密码: #!/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:
#!/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()
我想使用双叉,我应该能够做到这一点。。。但到目前为止运气不好
非常感谢您对这方面的任何想法。我完全相信此链接以bash语法给出的答案: 你甚至不需要双叉。问题是标准输出仍然是连接的。以下是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->devul,进程就会立即返回。我完全相信这个链接提供了bash语法的答案: 你甚至不需要双叉。问题是标准输出仍然是连接的。以下是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,进程将立即返回。您不能在shell脚本中使用
&
吗?缩进不正确。你能再检查一下吗?不太可能。。。我宁愿用包装器脚本来处理它…嗯,我刚刚意识到我现在无法控制ssh部分。。。所以基本上我不能。你不能在shell脚本中使用&
吗?你的缩进不正确。你能再检查一下吗?不太可能。。。我宁愿用包装器脚本来处理它…嗯,我刚刚意识到我现在无法控制ssh部分。。。所以基本上不,我不能。@AmirReza:这是ssh命令调用的脚本,而不是ssh命令本身。您的ssh命令执行这个命令,启动您的实际进程。我的意思是,我的ssh行中没有“2>&1&”。ssh行是“ssh server wrapper.py”@AmirReza:你没在听我说什么。您的ssh命令与您刚才键入的完全相同。在wrapper.py内部,调用子流程命令,并将stdout重定向到dev null。当我通过ssh测试脚本时,您不需要对ssh命令调用脚本的方式做任何不同的操作。没有它,它会阻塞,直到过程完成。当我使用此方法时,ssh调用立即返回,进程仍在运行。这就是我的确切ssh命令:ssh-p22-I id\u dsafile-o StrictHostKeyChecking=no-o ConnectTimeout=30-o connectionattentits=2-o BatchMode=yes-Croot@server“wrapper.py x”@AmirReza:这在ssh命令调用的脚本中,不使用ssh命令本身。您的ssh命令执行这个命令,启动您的实际进程。我的意思是,我的ssh行中没有“2>&1&”。ssh行是“ssh server wrapper.py”@AmirReza:你没在听我说什么。您的ssh命令与您刚才键入的完全相同。在wrapper.py内部,调用子流程命令,并将stdout重定向到dev null。当我通过ssh测试脚本时,您不需要对ssh命令调用脚本的方式做任何不同的操作。没有它,它会阻塞,直到过程完成。当我使用此方法时,ssh调用立即返回,进程仍在运行。这就是我的确切ssh命令:ssh-p22-I id\u dsafile-o StrictHostKeyChecking=no-o ConnectTimeout=30-o connectionattentits=2-o BatchMode=yes-Croot@server“wrapper.py x”