web-dev-qa-db-ja.com

RHELのinit.d関数の成功関数はどのように機能しますか?

RHELから派生したAmazonLinux AMIを使用しており、servicesにSysVintを使用しています。私は経験豊富なLinuxユーザーではなく、servicesについて詳しく学んでいるので、/etc/init.d/functionsfunctionsスクリプトに出くわしました。 success関数とfailure関数がどのように機能するかがわかりませんwarningのようなものもありますが、それらはまったく同じ原理とコードです)。

私のfunctionsスクリプトは ここにあります であり、success関数は次のようになります。

# Log that something succeeded
success() {
  [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_success
  return 0
}

echo_success() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "["
  [ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS
  echo -n $"  OK  "
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "]"
  echo -ne "\r"
  return 0
}

率直に言って、このLSB変数がどこにも見つからないため、"${LSB:-}"の部分はわかりませんが、重要な部分は、スクリプトがsuccess関数を使用しているように見えることです。たとえば、daemon関数の最後の行は次のとおりです。

[ "$?" -eq 0 ] && success $"$base startup" || failure $"$base startup"

echoedはその後successへのパラメータをチェックしないため、$"$base startup"echoにはならないのでこれは私には意味がありません。文字列はログに記録されていると思いますが、繰り返しになりますが、どのようにログに記録されるかもわかりません。

これは本当に欠陥があるか、何かを理解していないだけだと思います。success関数の性質は、カーソルとインラインで緑色の[ OK ]を出力することです。これにより、いくつかの奇妙な出力が発生します。いくつかのスクリプト。たとえば、私のTomcatスクリプトは[ OK ]をカーソルの上に新しい行ではなく、端末のカーソルに出力しますが、これは本当に奇妙なことです。

weird OK

テキストはTomcat is running... [ OK ]のようなものであるはずでしたが、端末の行に印刷されていたため、ユーザー名とIPによってほとんどがトリミングされました。

では、これが間違っているのでしょうか、それともRHELサービスのsuccess関数がいたるところで間違って使用されているのでしょうか?

3
mFeinstein

あなたは間違っていませんが、関数が使用されているとまでは言いません誤って

率直に言って、このLSB変数がどこにも見つからないため、_"${LSB:-}"_の部分がわかりません。

また、$ LSBがどこにも設定されていることもわかりません。この変数がチェックされている理由についてのみ推測できます。完全なテストは次のとおりです。

_[ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_success
_

テストの結果は、BOOTUP変数の値がnot "verbose"で、LSB変数がnot setの場合、_echo_success_を実行することです。 _${varname:-text}_構文の定義は次のとおりです。

$ {parameter:-Word}デフォルト値を使用します。
パラメータが設定されていないかnullの場合、Wordの展開が置き換えられます。それ以外の場合は、パラメーターの値が置き換えられます。

ここでは、ダッシュの後に「Word」がないため、$ LSBが設定されていないかnullの場合、展開全体が(何も)発生せず、_-z_テストに合格します。

私の推測は、initスクリプトの動作を変更したい場合に備えてロジックが存在するということですnotこれらのsuccess()またはfailure()関数を実行します。

第二に、

スクリプトが成功関数を使用しているように見える方法。たとえば、デーモン関数の最後の行は次のとおりです。

_[ "$?" -eq 0 ] && success $"$base startup" || failure $"$base startup"
_

これらのパラメーターは関数に渡されますが、使用されないという点で正しいです。使用されていないパラメータを渡すことは無害です-一貫性がない/混乱するだけです!私の推測は、これらの関数の以前のバージョンが渡されたパラメーターを調べた(おそらくログに記録された?)ということです。

init_crypto()関数がsuccess()(またはfailure())を呼び出すことに注意してくださいなしパラメーター!

2
Jeff Schaller