종료할 머신을 함께 그룹화할 수 있으며 shutdown
bash의 표준 명령을 사용하여 종료할 수 있다고 들었습니다.
어떻게 설정하나요?
답변1
문제의 모든 머신에 SSH 액세스가 설정되어 있다고 가정합니다.
while read host; do
ssh "root@$host" shutdown -h now &
done < host-list
작동해야합니다. 구성 가능해야 하는 경우 호스트 목록을 구성과 유사한 파일에 넣기만 하면 됩니다.
답변2
먼저, 귀하의 질문에 대답하자면, shutdown
그 자체가 로컬 기능입니다. 클러스터 개념이 없습니다. 네트워크를 통해 메시지를 보내는 방법을 모릅니다. 조금 혼란스러울 수 있는 점은 이 wall
명령을 사용하여 모든 사용자에게 컴퓨터가 곧 종료될 것임을 알리는 것입니다. 하지만 이는 현재 컴퓨터에 연결된 사용자에게만 해당됩니다. 네트워크의 모든 사용자가 아닙니다(역시 wall
로컬 명령).
내 경우에는 시스템에 컨트롤러와 N개의 서비스 컴퓨터(내 테스트에서는 9개)가 있는 LAN에서 임베디드 소프트웨어를 사용하고 있습니다. 컨트롤러에는 전체 시스템을 종료하는 종료 기능이 있어야 하는데 이 환경에서는 SSH나 shutdown이 그다지 좋지 않습니다.
대신에 제가 한 일은 종료를 자체적으로 실행하는 명령을 만드는 것이었습니다. 이는 매우 간단하며 매우 작은 C 바이너리만 필요합니다.
int main()
{
setuid(0);
system("shutdown -t now"); // adapt the command to what you like
}
다음 명령을 사용하여 컴파일할 수 있습니다.
gcc -o my-shutdown my-shutdown.c
그런 다음 다음과 같은 곳에 설치하십시오./usr/sbin
cp my-shutdown /usr/sbin
chown root:root /usr/sbin/my-shutdown
chmod 4755 /usr/sbin/my-shutdown
이제 원격 컴퓨터를 종료하는 모든 사용자가 실행할 수 있는 명령이 생겼습니다.
중요한 팁:물론 이는 공용 시스템에서는 덜 안전합니다. 임베디드 시스템이 있기 때문에 저에게 효과적입니다. 동시에 종료해도 컴퓨터가 손상되지는 않습니다. 그러나 기능이 중단될 수 있습니다.
다음으로, 다른 컴퓨터에서 명령을 실행할 수 있기를 원합니다. 이를 위해서는 각 서비스 시스템에서 실행되고 연결을 수신하는 서버가 필요합니다. 시스템에서 이미 실행 중인 프로그램이 있는 경우 메시지에 대한 지원을 추가하고 위의 C 바이너리를 실행하기만 하면 쉽습니다. 그런 다음 종료 명령을 실행합니다.
아래에는 NodeJS로 작성된 매우 간단한 TCP 서버가 있습니다. 귀하의 경우에는 적합하지 않을 수 있지만 아직 서비스 시스템에서 실행 중인 서비스가 없는 경우 기본적인 아이디어를 제공할 수 있습니다.
실제로 C로 작성할 수 있다면 위에서 보여준 도구에 포함될 수 있습니다(즉, 명령줄을 루트로 실행되는 서버로 변경하면 함수 setuid()
호출도 필요하지 않습니다).
#!/usr/bin/env node
var net = require('net')
var runner = require('child_process')
var server = net.createServer((c) => {
console.log('client connected')
c.on('end', () => {
console.log('client disconnected')
});
c.write('SHUTTING DOWN\r\n')
// this could also directly be the `shutdown -t now` command
// (assuming we run this service as root)
runner.exec("/usr/sbin/my-shutdown")
c.destroy()
})
server.on('error', (err) => {
throw err
})
server.listen(2001, '10.0.2.10', (err) => {
if(err) {
console.log(`can not start listening on port: 1234, ${err}`)
return
}
console.log('server listening on 10.0.2.10:2001');
})
마지막으로 systemd를 사용하여 NodeJS 프로세스를 시작할 수 있습니다. 이를 호출 /usr/sbin/my-shutdown-server
하고 다음과 같은 구성 파일을 작성한다고 가정해 보겠습니다.
[Unit]
Description=My Shutdown Daemon
[Service]
Type=simple
ExecStart=/usr/sbin/my-shutdown-server
ExecStop=/bin/kill "$MAINPID"
Restart=on-failure
[Install]
WantedBy=multi-user.target
참고: 기본적으로 이 서비스는 루트로 실행됩니다. 다른 사용자로 변경하는 데 사용할
User=
수 있습니다.Group=
/lib/systemd/system/
이 파일을 다음 이름으로 저장하면 my-shutdown-server
이제 활성화하고 시작할 수 있습니다.
sudo systemctl enable my-shutdown-server
sudo systemctl start my-shutdown-server
컨트롤러에서 테스트할 수 있습니다.보내다메시지(이 경우에는 연결만으로도 종료가 발생하기에 충분합니다!) 예를 들면 다음과 같습니다 nc
.
nc 10.0.2.10 2001
다음과 같은 응답 메시지를 받아야 합니다."폐쇄"컴퓨터를 종료해야 합니다. 메시지를 닫기 전에 최소한 잠시 동안(예: "지금"이 아닌 5초) 기다리지 않으면 메시지에 응답하는 데 성공하지 못할 수도 있습니다.
다시 말하지만 여기에는 보안이 존재하지 않습니다. 이러한 컴퓨터에 액세스할 수 있는 사람은 누구나 해당 컴퓨터를 종료할 수 있습니다. 서버를 강화하면 종료뿐만 아니라 모든 종류의 명령을 보낼 수 있습니다(예: 다시 시작, 애플리케이션 다시 시작. 다시 시작할 필요 없음 등).