我正在通过SSH发送命令。这个特殊的命令告诉机器重新启动。不幸的是,这会挂起我的SSH会话,并且不会返回,因此我的脚本无法继续转发到其他任务。
我已经尝试了修改命令本身的各种组合,以包括"退出"和/或转义命令,但在这些情况下,机器都不会在重新启动和命令关闭SSH会话时捡起。我也尝试过SSH的ConnectTimeout和ClientAlive选项,但它们似乎使重启命令被忽略。
这里是否遗漏了一些明显的命令?
好吧,没有人发布任何与SSH有关的答案,所以我将提出一个SIGALRM
解决方案,如下所示:Using module 'subprocess'与超时
class TimeoutException(Exception): # Custom exception class
pass
def TimeoutHandler(signum, frame): # Custom signal handler
raise TimeoutException
# Change the behavior of SIGALRM
OriginalHandler = signal.signal(signal.SIGALRM,TimeoutHandler)
# Start the timer. Once 30 seconds are over, a SIGALRM signal is sent.
signal.alarm(30)
# This try/except loop ensures that you'll catch TimeoutException when it's sent.
try:
ssh_foo(bar) # Whatever your SSH command is that hangs.
except TimeoutException:
print "SSH command timed out."
# Reset the alarm stuff.
signal.alarm(0)
signal.signal(signal.SIGALRM, OriginalHandler)
这基本上设置了一个30秒的计时器,然后尝试执行你的代码。如果它没有在时间耗尽之前完成,则发送SIGALRM
,我们捕获并将其转换为TimeoutException
。这将迫使您进入except
块,在这里您的程序可以继续。
我将在那里抛出一些伪代码,但是我建议使用一个标志来表示您是否已经重新启动。
文件 rebootState.py
hasRebooted = False
文件 sshCommander.py
from rebootState import hasRebooted
if (hasRebooted):
# Write to rebootState.py "hasRebooted = True"
# System call to reboot machine
else:
# Continue execution