2019/07/20

[linux]systemctl stopは同期なのか?

最近、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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。