RHEL init.d 函数的成功是如何实现的?

RHEL init.d 函数的成功是如何实现的?

我使用的是 Amazon Linux AMI,它是 RHEL 的衍生版本,它使用 SysVint 作为services.我不是一个经验丰富的 Linux 用户,我正在了解更多信息services,所以我在以下位置遇到了该functions脚本/etc/init.d/functions我就是不明白它的工作原理successfailure功能(还有其他类似的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"

这对我来说没有任何意义,因为不会$"$base startup"检查它后面的任何参数。我认为该字符串正在被记录,但同样,我也看不到它将如何被记录。echoedsuccessecho

我想这确实有缺陷,或者我只是不理解某些东西......该函数的本质是与光标一起success打印绿色内联,这会在某些脚本上导致一些奇怪的输出。[ OK ]例如,我的tomcat脚本打印[ OK ]在终端的光标上,而不是在光标顶部的新行中打印,这真的很奇怪:

奇怪 好吧

文本应该是这样的tomcat is running... [ OK ],但由于它打印在我的终端线上,我的用户名和 IP 裁剪了大部分内容。

那么我是否理解错了,或者successRHEL 服务的功能是否到处都被错误地使用了?

答案1

你没有错,但我不会说这些函数正在被使用不正确地

坦率地说,我不明白这"${LSB:-}"部分,因为我在任何地方都找不到这个 LSB 变量

我也找不到在任何地方设置 $LSB 的情况。我只能推测为什么要检查这个变量;完整的测试是:

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

测试的结果是echo_success如果 BOOTUP 变量的值为不是“详细”,LSB 变量是不是放。语法${varname:-text}定义是:

${parameter:-word} 使用默认值。
如果参数未设置或为空,则替换单词的扩展。否则,将替换参数的值。

在这里,破折号后面没有“单词”,因此如果 $LSB 未设置或为 null,则整个扩展结果为(无),这将允许测试-z通过。

我的猜测如果您想更改 init 脚本行为,那么逻辑就在那里不是运行这些 success() 或 failure() 函数。

第二,

脚本如何使用 success 函数,例如守护程序函数的最后一行是:

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

您是正确的,因为这些参数已传递给函数,但未使用。传递未使用的参数是无害的——只是不一致/令人困惑!我的猜测这些函数的早​​期版本是否会查看(可能已记录?)传递的参数。

请注意,该init_crypto()函数调用 success() (或 failure())没有参数!

相关内容