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

Posted on Posted in 未分類, 趣味的なIT・ネットの話題

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が実行できるようになりました。

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

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

一体何これといろいろと調べていると、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の流儀もマスターしていきたいですね。

 

 

 

 


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