本当はTCP/IPのプログラムを書くべきかもしれないが、とりあえずSystemdを使ってそれっぽいことができたのでまとめておくことにした。
TL;DR
基本方針はSystemdにroot権限でsuspendさせるようにする
- Systemdにinotifywaitで特定ファイルの書き込みを監視させるプログラムを置く
- SSHで指定されたファイルにコマンドを書き込む
- コマンドに応じて指定された処理を実行
SSHで特定ファイルに'suspend'と書けばサスペンドできるようになる目論見
inotifywaitで特定ファイルの書き込みを監視する
#!/bin/bash
reqfile="てきとうなファイル"
while :
do
inotifywait -e modify -e close_write $reqfile
comreq=`cat $reqfile`
if [ "$comreq" = "suspend" ]; then
sudo systemctl suspend
elif [ "$comreq" = "kill" ]; then
break
elif [ "$comreq" = "test" ]; then
echo test
fi
done
echo finish
コマンドリクエスト用のファイルに書き込みがあったら内容を確認してコマンドに応じた処理が走るようになっている
ファイルは特定ユーザのみが読み書きできるようにしておくとrootまたは特定ユーザのみが書き込みできるようにできるので意図しないユーザがコマンド実行することはない
systemdでデーモン化
#Root commnader
[Unit]
Description=Watch commands, root execution.
[Service]
User=root
Group=root
ExecStart=/usr/local/bin/cmdwatch
Type=simple
[Install]
WantedBy = multi-user.target
ユーザをrootにするとcmdwatchで実行するコマンドがrootで実行されることになる
使いみち
macOSやwinなどでssh環境が整えてあれば以下のコマンドでサスペンドできるようになる
ssh -i 鍵ファイル user@server "echo suspend > 指定したファイル"
これをmacOSならAutomator、winならbatファイルとして保存しておけばダブルクリックでサスペンドできるようになる
べんり。
データ用のサーバPCが8台のHDDを使っていて音がうるさいのと電気がもったいないのでこんなことをすることになった
参考
そのほか
cmdwatchって名前をつけたけど、コマンド監視だけじゃなくて実行もするからネーミングとしてはよくなかったかもしれない