未分類趣味的なIT・ネットの話題

Raspberry PiでIoTなシステム開発:serviceコマンドはinit.dにスクリプトがあればrc*.dにスクリプトが無くても実行できる って話題がよくよく調べてみるとJessieはsystemdに変わっていたことに気づくという話題

service – Unix, Linux Command

serviceコマンドが環境変数の影響を排除してinit.dのスクリプトを実行できるということは色々なサイトに書かれていて概ね理解できていました。が、serviceが実態として、rc*.dのリンクを実行していて、その時点でのランレベルに応じた起動をするのか、とにかくinit.dにある方のスクリプトを直接実行しているのかが分からなかったのですが、このサイトによるとinit.dにある方を実行しているとのこと。

で、実際にinsservでrc*.dのシンボリックを全削除してみたところ、それでもserviceコマンドでサービスのstart/stopができました。

で更に実験としてinit.dの中のスクリプト名を変更したら、もちろん実行できなかったのですが、warningの中にあるsystemctlを実行すると、何故かktdが実行できるようになりました。

pi@raspberrypi:/etc/init.d $ sudo mv ktd tttd
pi@raspberrypi:/etc/init.d $ sudo service ktd start
Warning: Unit file of ktd.service changed on disk, 'systemctl daemon-reload' recommended.
Job for ktd.service failed. See 'systemctl status ktd.service' and 'journalctl -xn' for details.
pi@raspberrypi:/etc/init.d $ systemctl daemon-reload
Failed to execute operation: Access denied
pi@raspberrypi:/etc/init.d $ sudo systemctl daemon-reload
pi@raspberrypi:/etc/init.d $ sudo service ktd start
pi@raspberrypi:/etc/init.d $ ps ax | grep ktd
 1619 ?        Rl     0:10 /home/pi/kt/ktd/ktd
 1622 ?        S      0:00 /home/pi/kt/ktd/ktd
 1663 pts/0    S+     0:00 grep --color=auto ktd

そして名称変更したものを元の名前に戻しても実行できません。

pi@raspberrypi:~ $ cd /etc/init.d/
pi@raspberrypi:/etc/init.d $ sudo mv tttd ktd
pi@raspberrypi:/etc/init.d $ cd ~
pi@raspberrypi:~ $ sudo service ktd start
Warning: Unit file of ktd.service changed on disk, 'systemctl daemon-reload' recommended.
Job for tttd.service failed. See 'systemctl status tttd.service' and 'journalctl -xn' for details.

その後、またsystemctlを実行して初めて実行できる様になりました。

pi@raspberrypi:~ $ sudo systemctl daemon-reload
pi@raspberrypi:~ $ sudo service ktd start
pi@raspberrypi:~ $ sudo service ktd stop

一体何これといろいろと調べていると、Jessieからinit.dによるinitではなくsystemdによるinitに変わったようなのです。今までのinit.dにスクリプトを書くスタイルは今後obsoleteになるとのこと。

systemd:wikipedia

init – もわの書斎

ここで疑問が出てくるのが、どうして既にsystemdに移行しているのに、init.dに沢山スクリプトが入っていて、実際にこれをいじるとサービスの起動なのかということ。systemdについて一番詳しいと思われる以下のページにも記述がありませんでした。

Systemd入門(1) – Unitの概念を理解する – めもめも

回答はこちらに。

How does systemd use /etc/init.d scripts? – Unix & Linux Stack Exchange

Raspberry Pi • View topic – systemv init processing in jessie

要はinit.dのスクリプトを起動時にsystemdがsystemdとしてのUnitに変換し、その上でsystemdの枠内で起動をしているとのこと。

そうなるとこれからはinit.dのシェルスクリプトを書くと変換という一手間を経るわけで、最初からsystemdのUnitを書く方が効率が良さそうです。ただシェルスクリプトでかける方が、sleepで無理矢理タイミングをずらすような処理がやりやすく、魅力があります。

とりあえず現時点ではinit.dで起動されるサービスが多数あり、自分のスクリプトだけsystemdに移行しても大勢に影響はなさそうですので、init.dのスタイルを続けることにします。が、並行してsystemdの流儀もマスターしていきたいですね。

 

 

 

 


Facebooktwitterpinterestlinkedinmail
納得したらすぐにシェア!