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

service – Unix, Linux Commandserviceコマンドが環境変数の影響を排除して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 tttdpi@raspberrypi:/etc/init.d $ sudo service ktd startWarning: 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-reloadFailed to execute operation: Access deniedpi@raspberrypi:/etc/init.d $ sudo systemctl daemon-reloadpi@raspberrypi:/etc/init.d $ sudo service ktd startpi@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 ktdpi@raspberrypi:/etc/init.d $ cd ~pi@raspberrypi:~ $ sudo service ktd startWarning: 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-reloadpi@raspberrypi:~ $ sudo service ktd startpi@raspberrypi:~ $ sudo service ktd stop

一体何これといろいろと調べていると、Jessieからinit.dによるinitではなくsystemdによるinitに変わったようなのです。今までのinit.dにスクリプトを書くスタイルは今後obsoleteになるとのこと。systemd:wikipediainit – もわの書斎ここで疑問が出てくるのが、どうして既にsystemdに移行しているのに、init.dに沢山スクリプトが入っていて、実際にこれをいじるとサービスの起動なのかということ。systemdについて一番詳しいと思われる以下のページにも記述がありませんでした。Systemd入門(1) – Unitの概念を理解する – めもめも回答はこちらに。How does systemd use /etc/init.d scripts? – Unix & Linux Stack ExchangeRaspberry 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の流儀もマスターしていきたいですね。    “””

コメントをどうぞ

メールアドレスが公開されることはありません。 が付いている欄は必須項目です