perl/python中保持系统退出状态的超时限制

2024-10-03 04:30:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的perl脚本,它调用另一个python脚本来在云中部署服务器。在

我在perl中捕获部署的退出状态,以便在成功/失败设置之后采取进一步的操作。在

就像:

$cmdret = system("python script.py ARG1 ARG2");

在这里,python脚本运行3到7小时。在

这里的问题是,不管成功或失败的返回状态如何,系统在这一步随机地接收到一个信号HUP,即使进程以后退的方式运行并且进一步中断了这些步骤。在

那么,有人知道,如果有任何时间限制来保持系统的返回状态,从而导致发送挂断信号?在

在python脚本script.py中,使用pexpect远程执行脚本:

^{pr2}$

并且doSshpexpect子例程:

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脚本中的其余步骤也不会继续。在


Tags: py脚本childhost信号状态系统部署
2条回答

如果您的目标是让perl程序忽略HUP信号,那么您可能只需要设置$SIG global signal handler哈希的HUP条目:

$SIG{ 'HUP' } = 'IGNORE';

有关血淋淋的详细信息,请参见

^{pr2}$

终端断开时发送SIGHUP。当您想创建一个不绑定到终端的进程时,您可以daemonize它。在


请注意,nohup不会去元化。在

$ nohup perl -e'system "ps", "-o", "pid,ppid,sid,cmd"'
nohup: ignoring input and appending output to `nohup.out'

$ cat nohup.out
  PID  PPID   SID CMD
21300 21299 21300 -bash
21504 21300 21300 perl -esystem "ps", "-o", "pid,ppid,sid,cmd"
21505 21504 21300 ps -o pid,ppid,sid,cmd

如你所见

  1. perl的PPID是启动它的程序的PPID。在
  2. perl的SID是启动它的程序的SID。在

由于会话没有更改,当终端正常断开连接时,它将向perl发送SIGHUP。在

也就是说,nohup通过使SIGHUP被忽略而改变了{}处理SIGHUP的方式。在

^{pr2}$

如果perl被信号杀死,那是因为某些东西改变了perl处理SIGHUP的方式。在

因此,要么对进程进行守护进程,要么让perl忽略use SIGHUP(例如,通过使用nohup)。但是如果使用nohup,不要重新启用默认的SIGHUP行为!在

相关问题 更多 >