最近、systemctlを使うことがある。
起動時に立ち上げたい処理があるのだけど、最近はどうもsystemctlというかsystemdというかを使うらしい、というのが理由だ。
立ち上げるのは良いのだが、システムを停止するときに安全に止めたいという要望もある。
普通にsystemctl stopを実行すると、どうもkillっぽく動いているものを止めてしまうようだった。
serviceの中に「ExecStop=」を書いておくとそれを実行するらしい。
では、ExecStopに止める処理を書いていたとして、そのまますぐにhaltさせてもよいのだろうか?
もしかしたら、systemctl stopは要求だけ出してすぐに戻ってくるかもしれない。
不安になったので、確かめることにした。
こんなtest.serviceを書いた。
[Unit] Description = test [Service] ExecStart=/home/xxxx/test.sh ExecStop=/home/xxxx/stop.sh Type=simple User=xxxx Group=xxxx [Install] WantedBy=multi-user.target
test.shもstop.shも、whileで無限ループして1秒おきにechoするだけのスクリプトである。
startしてstopすると・・・おお、stopから戻ってこない。
ということは、同期処理なんだろう。
胸をなで下ろしていたのだが、この文章を書いているうちに、いつの間にかコンソールに戻っていた。
journalctlで見てみると、タイムアウトしたらしい。
Jul 20 17:17:03 hovbox systemd[1]: test.service: Stopping timed out. Terminating. Jul 20 17:17:03 hovbox systemd[1]: test.service: Failed with result 'timeout'. Jul 20 17:17:03 hovbox systemd[1]: Stopped test.
timeで見ると、1分半らしい。が、まだ長かった気がするなぁ。。。
とりあえず、以下が分かったのでよしとしよう。
- タイムアウトまでは同期で処理待ちを行う
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。