여러 머신을 원격으로 재부팅


11

여러 컴퓨터를 원격으로 재부팅해야합니다. 일반적으로 나는 단지 발행

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

그러나 다시 시작하기 전에 사용자에게 시간을주고 싶습니다. 그러나 ssh 세션은 내가 사용하더라도 연결이 끊어지지 않습니다.

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

오류 메시지가 나타납니다.

bash : -c : line 0 : 예기치 않은 토큰 ;' bash: -c: line 0:sudo shutdown -r +5 &; disown ' 근처의 구문 오류

어떤 제안?


1
"&"를 사용하여 종료 명령을 백그라운드로 보내려고합니다. 쉘이 "&"를 명령 분리 자로 해석하는 경우 "disown"명령이 작동하도록 백그라운드로 쉘을 보내는 방법에 대해 잘 모르겠습니다.
Horace

&문자는 백그라운드에서 왼쪽에 명령을 전송한다. 그것이와 다른 점입니다 ;.
kasperd

답변:


31

오류 메시지에 표시된대로 명령에 구문 오류가 있습니다. &쉘 명령의 일부가 아니라 명령 사이의 구분 기호 인 약간 놀라운 사실 때문입니다 ;. 둘 다 명령 구분 기호이지만 &왼쪽 명령에 추가 영향을 미칩니다. 이것은 또한 때때로 나를 혼란스럽게하며, 종종 같은 실수를합니다. 일단 알면 쉽게 고칠 수 있습니다.

수정은 &;의도에 따라 쓰지 않고 두 구분 기호 중 하나를 작성하는 것입니다. (그리고 대부분의 경우 &;의도 를 작성한 경우을 쓰면됩니다 &).

이것은 작동해야합니다 :

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

7
유닉스에서 25 년 동안 강타한 후에 알지 못하는 것을 가르쳐 준 오늘 상을 수상했습니다. 또한 +1!
MadHatter

그가 sudo shutdown -r +5 &백그라운드 에서 실행 한 다음 실행하려면 disown어떻게해야합니까? bash는 이러한 상황을 어떻게 처리합니까? 나는 이것이 심지어 명령을위한 완벽한 구문 일 것으로 기대합니다 &;. ;명령 구분 기호 인 경우 손에 2 개의 명령이 있습니다. 권리?
Ismael Miguel

1
@IsmaelMiguel 질문이 없습니다. 를 사용 &하면 백그라운드에서 첫 번째 명령이 시작되고 첫 번째 명령이 시작되면 두 번째 명령이 포 그라운드에서 실행됩니다.
kasperd

나는 그것이 sudo shutdown -r +5 &; disown나쁜 구문처럼 보이지 않는다는 것을 의미했습니다 . 내 의도는 첫 번째 부분을 백그라운드에서 실행 한 다음 두 번째 부분을 실행하는 것입니다.
Ismael Miguel

@IsmaelMiguel 빈 문자열을 항상 유효한 명령으로 간주하도록 명령 구문 분석기를 확장 할 수 있습니다. 이 경우 와로 sudo shutdown -r +5 &; disown구분 된 유효한 명령 3 개로 간주됩니다 . 그러나 이전 명령의 존재 상태를 사용하려면 추가 구분 기호를 사용하지 않도록주의해야합니다. 그것은 하나의 예를 들어 있기 때문에뿐만 아니라 토큰 화에 지불 관심을 가지고 있음을 의미 하는가 와 다르게 토큰 화됩니다. &;&&& &
kasperd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.