[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:27559] Re: 起動スクリプトの変更



佐野@浜松です。

In <4.3.2-J.20010321122602.00bffaf0@xxxxxxxxxxxxxxxxxxxxxxxxxx>,
  on "Wed, 21 Mar 2001 12:39:44 +0900',
   with "Re: 起動スクリプトの変更",
 Seiji Kaneko <se-kane@xxxxxxxxxxxxxxxxx> さん wrote:

> アップデート時に何が起こるかはローカルの管理者では管理できない。
> 
> ∵) rc*.d へのシンボリックリンクは「設定」扱いではないから。

これはそうですね。 update-rc.d で設定するにしろ、コマンドラインで
 mv するにしろ、パッケージをアップグレードする際に postinst などで
 update-rc.d を使って再設定されてしまえば元に戻ってしまいます。

> で,最初に戻ると,ランレベル毎にローカルで動かすデーモンを細かく
> 弄りたい, という要求にうまい解があるか, というと「ない」が答え
> なんじゃないでしょうか。現実に x 関連を除くと, ランレベルを
> 実行時に細かく切り変えている管理者はほとんど居ないので, あまり
> 問題になっていないのかもしれません。

ひとつの解としては/etc/init.d/ 以下の起動スクリプト (これは設定
ファイル扱いなのでアップグレード時にファイルを入れ換えるかどうか
聞いてくる) を編集する方法がありますね。

で、かねこさんの書かれた方法はこれなんですが、そのまま exit 0
してしまうとどのランレベルでも使えません。

ところで /etc/init.d/ 以下にあるデーモン起動用スクリプトでは

case "$1" in
  start)
 (略)
  ;;

  restart)
 (略)
  ;;

  reload)
 (略)
  ;;

  force-reload)
 (略)
  ;;

  stop)
 (略)
  ;;

  *)
    echo "Usage: /etc/init.d/[package] {start|stop|restart|reload|force-reload}"
    exit 1
    ;;
esac
 
といった部分があるはずですが、このうちの start) から ;; までの部分が
システム起動時に実行される処理です。

なので、start) 直後の部分に、例えば

    # for runlevel 2 or 3, not start [...]
    if [ "$RUNLEVEL" -eq 2 ]; then echo "[...] stopped at level 2"; exit 0; fi
    if [ "$RUNLEVEL" -eq 3 ]; then echo "[...] stopped at level 3"; exit 0; fi

といった行を挿入しておけば、 runlevel 2 および 3 では
このデーモンを init によって自動起動させることがないように
できます。

ただ、この方法だとコマンドラインから /etc/init.d/<package> start 
した場合には、自分で環境変数 RUNLEVEL を設定しておかないとそのまま
起動することになります。「そのほうがいい」のであれば良いのですが、
「それでは困る」という場合はもうちょっと違う記述をしないといけません。

もしも特定のランレベルでのみ起動させたいということであれば
例えば

    if [ "$RUNLEVEL" -ne 4 ]; then echo "[...] stopped not at level 4"; exit 0; fi

としておけば、環境変数 RUNLEVEL が 4 である場合のみ起動される
ことになります。

また、この場合はコマンドラインから /etc/init.d/<package> start しても
環境変数 RUNLEVEL 4 が設定されていなければ途中で止まります。



なお、環境変数 RUNLEVEL の説明は man 8 init にあります。

環境変数
       initは子プロセスのために以下のような環境変数を設定する:

       PATH   /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin

       INIT_VERSION
              名前の通り。あるスクリプトがinitにより直接実行さ れ
              たのかどうかを見分ける際に有用。

       RUNLEVEL
              システムの現在のランレベル。

       PREVLEVEL
              直前のランレベル(ランレベルを変更した際に有用)。

-- 
     # (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
    <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)