远程重启多台机器


11

我需要远程重启许多机器。通常我只是发出

for host in <hostlist>;do ssh ${host} 'sudo shutdown -r now';done

但是我想给用户一些时间,然后重新启动。但是,即使我使用它们,它们的ssh会话也不会断开连接:

ssh -f 'sudo shutdown -r +5 &;disown'

我收到一条错误消息:

bash:-c:第0行:意外令牌;' bash: -c: line 0:sudo shutdown -r +5&; disown' 附近的语法错误

有什么建议?


1
我应该补充一点,我正在尝试使用“&”将关闭命令发送到后台。如果外壳程序将“&”解释为命令分隔符,那么我很困惑如何将其发送到后台,以便“ disown”命令起作用。
Horace 2015年

&字符确实在后台左侧发送命令。这与有所不同;
kasperd 2015年

Answers:


31

如错误消息所述,您的命令中存在语法错误。这是由于有些令人惊讶的事实,&它不是shell命令的一部分,而是命令之间的分隔符(例如;is)。尽管两者都是命令分隔符&,但对命令的左侧还有其他影响。当然,这有时也会使我感到困惑,并且我经常犯同样的错误。一旦知道,就很容易修复。

解决方法是不写&;而是根据您的意图只写两个分隔符之一。(而且在大多数情况下,写信&;的意图是只写信&)。

这应该工作:

ssh server 'sudo shutdown -r +5 & disown'

7
经过25年的UNIX猛烈抨击,您获得了今天的奖励,因为它教了我一些我不知道的知识。也+1!
MadHatter

如果他打算sudo shutdown -r +5 &在后台运行然后再运行disown怎么办?bash如何处理这种情况?我希望这是命令的完美语法,即使有&;。如果;是命令分隔符,则您手上有2条命令。对?
伊斯梅尔·米格尔

1
@IsmaelMiguel我不明白你的问题。使用&将在后台启动第一个命令,一旦启动了第一个命令,第二个命令将在前台运行。
kasperd 2015年

我的意思是,这sudo shutdown -r +5 &; disown似乎不是一个糟糕的语法。我的意思是,我的意图可能是在后台运行第一部分,然后在第二部分运行。
伊斯梅尔·米格尔

@IsmaelMiguel命令解析器可能会扩展为将空字符串视为始终成功的有效命令。在那种情况下,sudo shutdown -r +5 &; disown将被视为由&和分隔的三个有效命令;。但是,这意味着如果要使用上一个命令的存在状态,则必须小心不要使用附加的分隔符。确实的确意味着,例如&&,自从起,人们也必须注意令牌& &化,而令牌化也有所不同。
kasperd 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.