Linux - サービスの init.d 起動と service 起動の違い!
Updated:
Linux 上でサービス起動・停止等の操作を行う際に、/etc/init.d/xxxx [start|stop|...] や service xxxx [start|stop|...] とコマンドを入力すると思います。
一見全く同じ挙動するように思うかも知れませんが、厳密には異なります(場合によっては異なる挙動をします)。
以下、それについての備忘録です。
1. init.d 起動と service 起動の違い
init.d 起動、つまり以下のように実行してサービスを起動する場合は、
# /etc/init.d/xxxx start
環境変数全てこのコマンド実行時のまま引き継がれて、サービス起動作業に移る。
一方、service 起動、つまり以下のように実行してサービスを起動する場合は、
# service xxxx start
環境変数 PATH と TERM のみが引き継がれて、サービスの起動作業に移る。
※但し、CentOS 6 系の場合。CentOS 5 や Ubuntu 系だと LANG も引き継がれる)。
2. service コマンドの内容確認
なぜ、環境変数 PATH と TERM のみが引き継がれるのか、/sbin/service コマンド(スクリプト)の内容を確認してみた。(CentOS 6 系の場合)
以下(”/sbin/service” を grep した結果)のように env コマンドに -i(継承された環境を無視して、空の環境から始める)オプションを付加して環境変数をリセット後、新たに PATH と TERM だけをセットし直していることが分かる。
File: /sbin/service
1
2
3
4
5
6
7
env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" status
env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" stop
env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" start
env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
3. 結論
init.d 起動と service 起動とで挙動に違いがあるということから、分かること・言えることは以下のとおり。
- 環境変数に影響されないようなサービス(起動スクリプト)なら、
init.d起動もservice起動も変わりはない。 init.d起動とservice起動で挙動が異なる場合は環境変数が影響している、と検討が付く。- サービスを実行しようとする一般ユーザによって環境変数が異なる場合は、
service起動の挙動も一般ユーザによって異なることがある。 - 上記の事項を理解した上で、運用ルールを定めておくと良いだろう。
知っていれば、何かの時に役に立つ(原因に気付くのが早くなる)でしょう。
以上。
Comments