【发布时间】:2016-04-10 04:53:05
【问题描述】:
我有一个简单的 perl 脚本,它调用另一个 python 脚本在云中部署服务器。
我在 perl 中捕获部署的退出状态,以便在成功/失败设置后采取任何进一步的措施。
就像:
$cmdret = system("python script.py ARG1 ARG2");
这里的 python 脚本运行 3 小时到 7 小时。
这里的问题是,无论返回状态是成功还是失败,即使进程在后台运行并进一步中断步骤,系统也会在此步骤随机接收信号 HUP。
那么有谁知道,是否有任何时间限制来保持系统返回状态导致发送挂断信号?
在python脚本script.py内部,使用pexpect远程执行脚本:
doSsh(User,Passwd,Name,'cd '+OutputDir+';python host-bringup.py setup')
doSsh(User,Passwd,Name,'cd '+OpsHome+'/ops/hlevel;python dshost.py start')
....
而doSsh 是一个pexpect 子例程:
def doSsh(user,password,host,command):
try:
child = pexpect.spawn("ssh -o ServerAliveInterval=100 -n %s@%s '%s'" % (user,host,command),logfile=sys.stdout,timeout=None)
i = child.expect(['password:', r'\(yes\/no\)',r'.*password for paasusr: ',r'.*[$#] ',pexpect.EOF])
if i == 0:
child.sendline(password)
elif i == 1:
child.sendline("yes")
child.expect("password:")
child.sendline(password)
data = child.read()
print data
child.close()
return True
except Exception as error:
print error
return False
第一次doSsh 执行需要~6 小时,并且在执行几个小时后该会话被终止并显示消息:Signal HUP caught; exitingbut
执行python host-bringup.py setup 仍然在远程主机中运行。
所以在本地系统中,下一个doSsh 永远不会运行,perl 脚本中的其余步骤也永远不会继续。
【问题讨论】:
-
系统的 perldoc 页面讨论了信号处理。从命令行执行“perldoc -f system”。另外,请注意,信号处理在不同 *nix 变体上的行为可能完全不同,因此您可能应该注意您使用的是什么操作系统。
-
顺便说一句,不需要调用 shell。
$cmdret = system("python", "script.py", " ARG1", "ARG2");
标签: python linux perl devops nohup