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で書くことができれば、上記のツールに含めることができます(つまり、コマンドラインをrootとして実行されているサーバーに変更する場合、関数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

注:デフォルトでは、このサービスはrootとして実行されます。他のユーザーに変更するために使用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秒)待機しないと、メッセージに応答できない可能性があります。

ここでもセキュリティは存在しません。これらのコンピュータにアクセスできる人は誰でもそのコンピュータをシャットダウンできます。サーバーを強化すると、シャットダウンだけでなく、あらゆる種類のコマンドを送信できます(例:再起動、アプリケーションの再起動、再起動は不要)。

関連情報