我通过SSH发送命令。这个特殊命令恰好告诉机器重启。不幸的是,这会挂起我的SSH会话并且不会返回,因此我的脚本无法继续转发到其他任务。
我尝试过修改命令本身的各种组合,包括"退出"和/或转义命令,但在这些情况下,机器都不会同时启动重启和关闭SSH会话的命令。我也尝试过SSH的ConnectTimeout和ClientAlive选项,但它们似乎忽略了重启命令。
我在这里缺少一些明显的命令吗?
答案 0 :(得分:4)
没有人专门发布任何与SSH有关的答案,所以我会提出一个SIGALRM
解决方案,例如:https://stackoverflow.com/a/1191537/3803152
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
块,您的程序可以在此处继续。
答案 1 :(得分:0)
只是要扔掉一些伪代码,但我会建议使用一个标记来表示你是否已经重新启动。
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