我有一个简单的perl脚本,它调用另一个python脚本来在云中部署服务器。在
我在perl中捕获部署的退出状态,以便在成功/失败设置之后采取进一步的操作。在
就像:
$cmdret = system("python script.py ARG1 ARG2");
在这里,python脚本运行3到7小时。在
这里的问题是,不管成功或失败的返回状态如何,系统在这一步随机地接收到一个信号HUP,即使进程以后退的方式运行并且进一步中断了这些步骤。在
那么,有人知道,如果有任何时间限制来保持系统的返回状态,从而导致发送挂断信号?在
在python脚本script.py
中,使用pexpect远程执行脚本:
并且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; exiting
,但是
执行python host-bringup.py setup
仍在远程主机上运行。在
因此在本地系统中,下一个doSsh
永远不会运行,perl脚本中的其余步骤也不会继续。在
如果您的目标是让perl程序忽略HUP信号,那么您可能只需要设置$SIG global signal handler哈希的HUP条目:
有关血淋淋的详细信息,请参见
^{pr2}$终端断开时发送SIGHUP。当您想创建一个不绑定到终端的进程时,您可以daemonize它。在
请注意,
nohup
不会去元化。在如你所见
perl
的PPID是启动它的程序的PPID。在perl
的SID是启动它的程序的SID。在由于会话没有更改,当终端正常断开连接时,它将向
perl
发送SIGHUP。在也就是说,}处理SIGHUP的方式。在
^{pr2}$nohup
通过使SIGHUP被忽略而改变了{如果
perl
被信号杀死,那是因为某些东西改变了perl
处理SIGHUP的方式。在因此,要么对进程进行守护进程,要么让
perl
忽略use SIGHUP(例如,通过使用nohup
)。但是如果使用nohup
,不要重新启用默认的SIGHUP行为!在相关问题 更多 >
编程相关推荐