RHELから派生したAmazonLinux AMIを使用しており、services
にSysVintを使用しています。私は経験豊富なLinuxユーザーではなく、services
について詳しく学んでいるので、/etc/init.d/functions
でfunctions
スクリプトに出くわしました。 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 ]
をカーソルの上に新しい行ではなく、端末のカーソルに出力しますが、これは本当に奇妙なことです。
テキストはTomcat is running... [ OK ]
のようなものであるはずでしたが、端末の行に印刷されていたため、ユーザー名とIPによってほとんどがトリミングされました。
では、これが間違っているのでしょうか、それともRHELサービスのsuccess
関数がいたるところで間違って使用されているのでしょうか?
あなたは間違っていませんが、関数が使用されているとまでは言いません誤って。
率直に言って、この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())を呼び出すことに注意してくださいなしパラメーター!