ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:liao シェルスクリプトの内容の確認
困り度:
  • 困っています
Solarisのスクリプトについて教えてください。
以下のスクリプトファイルが登録されており、その内容の詳細を確認したいと思っております。

(1) 5行目の "$1" は何を意味しているのでしょうか?

(2) 12行目の 「echo 」文内に「{ start | stop }」と記述がありますが、この start / stop
はどの情報を元に判断して結果が出力されるのでしょうか?

(3) 12行目の 「echo 」文のコマンドの後に、13行目「exit 1」と14行目「;;」がありますが、
これはどちらの行でcase文を抜けるということになるのでしょうか?

=========================================================================================
#!/bin/sh
#
# /etc/init.d/nodemanager.sh
#
case "$1" in
start)
if [ -f /home/bea81/weblogic81/server/bin/startNodeManager.sh ] ; then
/bin/su - weblogic -c 'cd /home/bea81/weblogic81/server/bin;./startNodeManager.sh &'
fi
;;
*)
echo "Usage: /etc/rc2.d/S99nodemanager{ start | stop }"
exit 1
;;
esac
exit 0
=========================================================================================

よろしくお願いいたします。
質問投稿日時:09/11/06 16:02
質問番号:5426451
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:takapiii >についてですが、このスクリプトの場合、「esac」の後に処理が特にあるわけではないので、結果的には exit1 の行は有っても無くても同じという事になるのでしょうか?

引数はstartまたはstopが正しい引数なので、それ以外が来た場合、異常終了であると親プロセスには告げる必要がありますので、0ではなく1でexitするのが正しい処理です。
無くても大きな問題はありませんが、たとえばブートプロセスがログを残すなどの処理をする場合(OKとかFilureとか表示するとか)、あった方が望ましいですね。
じゃないと失敗しているのにexit 0が実行されて正常終了になってしまいますから。

>( startという引数でない場合は、12行目が実行、13行目で異常終了となり、スクリプトの最後までは実行されることはないという認識で良いですよね?)

されません。なので、exit 0 は実行されません。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:09/11/06 18:16
回答番号:No.4
この回答へのお礼ありがとうございます。
モヤモヤ感がクリアされました。

なるほど、その通りですね。
ログに記録が残ったことを考えると、おっしゃる通りです。

何度もご回答いただき、ありがとうございました。

回答

 

回答者:takapiii >すると、12行目で
>「Usage: /etc/rc2.d/S99nodemanager start」
>と出力されることは通常ではあり得ない、という事になるのでしょうか?

細かく書くと長くなってしまいますが、通常はブートプロセスが親になってブート時にstartという引数を与えてこのshellを自動起動します。
シャットダウン時には、stopという引数を与えて起動しますので、*)つまりそれ以外の値が来る事は通常ありえません。
但し、このshelは手動起動もできるので、Usage(使い方)が表示されるように作っているだけで、この方法は一般的です。

なお、echoなので、Usageの最後は、startかstopのどちらかが表示されるんじゃなく、そのまま{start | stop}と表示されます。これはstartまたはstopのどちらかを引数に与えてくださ、という意味に解釈されます。

>この場合、exit1を経由した時点でどのような動作になるのでしょうか?
>「1を親プロセスに返して」との事ですが、"親プロセス"とは何を指すのでしょうか?

exitはシェルスクリプトの終了コマンドですので、終了ステータス1(1は通常異常終了)の状態で、親であるブートプロセス(正確に言うともっと細かな話になりますのでOSのブートプロセスのひとつと認識してください)に終了を告げます。
終了を告げられたブートプロセスは次の別の処理(別の何かを起動するとか)に入ります。

なので、exit 1を経由した時点で、その後の処理はスキップされます。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:09/11/06 17:40
回答番号:No.3
この回答へのお礼詳しい説明、ありがとうございます。
内容・動きが理解できていました。

>この場合、exit1を経由した時点でどのような動作になるのでしょうか?
>「1を親プロセスに返して」との事ですが、"親プロセス"とは何を指すのでしょうか?

についてですが、このスクリプトの場合、「esac」の後に処理が特にあるわけではないので、結果的には exit1 の行は有っても無くても同じという事になるのでしょうか?

( startという引数でない場合は、12行目が実行、13行目で異常終了となり、スクリプトの最後までは実行されることはないという認識で良いですよね?)

初歩的な質問で申し訳ございませんが、よろしくお願いいたします。

回答

 

回答者:takapiii (3)の質問の意味が違ったかもしれないので補足です。

なぜかstop)がありませんが…。
start以外が来た場合(本当はstopの場合の処理も必要ですが)、
Usage: /etc/rc2.d/S99nodemanager{ start | stop }と表示してshellは終了します。その際、1を親プロセスに返して異常終了を通知します。
case文を抜けるのは;;です。

exit 1を経由しなければ、esacでcase文の終端になるので、exit 0 で正常終了です。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:09/11/06 16:31
回答番号:No.2
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:takapiii (1)一つ目の引数の値

(2)$1の値で処理が振り分けられます。startの場合は7-10行目が実行されます。

(3)esacがcase分の終端
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:09/11/06 16:23
回答番号:No.1
この回答へのお礼ご回答、ありがとうございます。
このスクリプトファイルは、サーバ起動時にサービスとして登録されています。

※すみません、スクリプトは他の人が作ったもので確認ができません。
(間違ったスクリプトになってしまっている可能性もあります)


すると、12行目で
「Usage: /etc/rc2.d/S99nodemanager start」
と出力されることは通常ではあり得ない、という事になるのでしょうか?
(startの引数の場合は7-10行目が実行されてcase文を抜けるため)



この場合、exit1を経由した時点でどのような動作になるのでしょうか?
「1を親プロセスに返して」との事ですが、"親プロセス"とは何を指すのでしょうか?

たびたび申し訳ございませんが、よろしくお願いいたします。
最新から表示回答順に表示良回答のみ表示