Daemon on systemd
Version 253でnotify-reloadというTypeが追加された。
ローカルな通信だけでも動くならnetwork-online.target
よりnetwork.target
の方が良さそう。
network-online.target
は起動時のネットワークデバイスの設定が終わっていることを保証するだけで現在ネットワークが疎通しているか確認出来るものではない
Rustでシグナルハンドラを設定したりするには以下の例のようにすると良い。
普通は上で良いけど、パイプとかソケットのread(2)みたいな無限に待つ可能性があるシステムコールは中断してそちらの処理をしたいという場合には上のだと駄目だな。
マルチスレッドのプログラムでシグナルをブロックしたいときは、全スレッドがブロックするようにしないとブロックしてないスレッドで受信してしまう
逆に1つのスレッドを除いてブロックすれば、そのスレッドがシグナルを受信してくれる(はず)
シグナルは別スレッドで処理すれば無限に待っても大丈夫そう。(結局一番上のやり方で良さそう)
sigwaitとsigsuspend似てるけど、waitはどのシグナルが来たか分かり、ハンドラが走らない
suspendもハンドラの引数で分かるが直接戻り値では分からない
結局シグナルも非同期なのでasync/awaitで処理するのが簡単な気がしてきた。
Rustのsd_notifyはこれ
ExecReload=kill -HUP $MAINPID
は完了を待たないので非推奨とされているが普通にこれでやっているサービスが多いな
Type=notify-reload
にするか(ただし253以降が必要)、ちゃんと完了を待つようなコマンド(例えばD-busとかで)が推奨されている
250以降では認証情報の管理にsystemd-credsが使える。
それ以前は所有者を適切に設定した上でパーミッションを600にしておく位な気がする。
SSHのserver側の秘密鍵(/etc/ssh/ssh_host_ed25519_key
とか)はそうなっているようなので。
systemd-analyze security hoge.service
でサービスのセキュリティ評価をしてもらえる
hyper+rustlsだとエラーになる? (native-tlsなら大丈夫っぽい)
PrivateUsersを指定してるとCapabilitiesの設定が上手く行かないよう