shutdown 명령을 사용하여 컴퓨터 그룹을 종료하는 방법은 무엇입니까?

shutdown 명령을 사용하여 컴퓨터 그룹을 종료하는 방법은 무엇입니까?

종료할 머신을 함께 그룹화할 수 있으며 shutdownbash의 표준 명령을 사용하여 종료할 수 있다고 들었습니다.

어떻게 설정하나요?

답변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초) 기다리지 않으면 메시지에 응답하는 데 성공하지 못할 수도 있습니다.

다시 말하지만 여기에는 보안이 존재하지 않습니다. 이러한 컴퓨터에 액세스할 수 있는 사람은 누구나 해당 컴퓨터를 종료할 수 있습니다. 서버를 강화하면 종료뿐만 아니라 모든 종류의 명령을 보낼 수 있습니다(예: 다시 시작, 애플리케이션 다시 시작. 다시 시작할 필요 없음 등).

관련 정보