为什么 $ service --status-all 输出到 STDERR 而不是 STDOUT?

den*_*que 4 command-line init.d services

这是非常不直观的。

例如

当用户尝试:

# service --status-all | grep postgres
Run Code Online (Sandbox Code Playgroud)

这行不通...

grep“服务”的唯一方法是:

# service --status-all 2>&1 | grep postgres
Run Code Online (Sandbox Code Playgroud)

例如在 Gentoo Linux 上不会出现这个问题:

# rc-status | grep postgres
Run Code Online (Sandbox Code Playgroud)

会正常工作。

lga*_*rzo 7

这听起来可能有点奇怪,但事实并非如此。更准确地说,它只显示[?]标准错误的未知状态(除了其他错误消息)。

您可以在/usr/sbin/services. 相关部分如下(第 68--98 行):

   if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then
      cd ${SERVICEDIR}
      for SERVICE in * ; do
        case "${SERVICE}" in
          functions | halt | killall | single| linuxconf| kudzu)
              ;;
          *)
            if ! is_ignored_file "${SERVICE}" \
        && [ -x "${SERVICEDIR}/${SERVICE}" ]; then
                    if ! grep -qs "\Wstatus)" "$SERVICE"; then
                      #printf " %s %-60s %s\n" "[?]" "$SERVICE:" "unknown" 1>&2
                      echo " [ ? ]  $SERVICE" 1>&2
                      continue
                    else
                      out=$(env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1)
                      if [ "$?" = "0" -a -n "$out" ]; then
                        #printf " %s %-60s %s\n" "[+]" "$SERVICE:" "running"
                        echo " [ + ]  $SERVICE"
                        continue
                      else
                        #printf " %s %-60s %s\n" "[-]" "$SERVICE:" "NOT running"
                        echo " [ - ]  $SERVICE"
                        continue
                      fi
                    fi
              #env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status
            fi
            ;;
        esac
      done
      exit 0
Run Code Online (Sandbox Code Playgroud)

echo " [ + ] $SERVICE"行并没有打印到标准错误,所以[ - ]变种。

您可以轻松地运行测试上述假设:services --status-all 2>/dev/null。如果您有任何支持status命令的正在运行的服务,它将被列出。

  • @kaliatech 该脚本仅在找到不支持 `status` 选项的服务时才输出到 `stderr`。从脚本的角度来看,这是一个错误,因为它假定每个服务都应该遵守标准。相信随着时间的推移,`[?]`状态的数量会大大减少,最终消失。 (2认同)