Por que $ serviço --status-all é enviado para STDERR em vez de STDOUT?

4

Isso é muito pouco intuitivo.

por exemplo,

Quando um usuário tenta:

# service --status-all | grep postgres

Isso não vai funcionar ...

A única maneira de grep 'service' é:

# service --status-all 2>&1 | grep postgres

No Gentoo Linux, por exemplo, este problema não ocorre:

# rc-status | grep postgres

funcionará bem.

    
por denysonique 21.10.2011 / 09:08

1 resposta

7

Pode parecer um pouco estranho, mas não . Para ser mais exato, ele exibe apenas [?] status desconhecidos no erro padrão (além de outras mensagens de erro).

Você pode ver o script em /usr/sbin/services . A parte relevante é a seguinte (linhas 68--98):

   if [ -z "${SERVICE}" -a $# -eq 1 -a "" = "--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

A linha echo " [ + ] $SERVICE" não é impressa no erro padrão e, portanto, a variável [ - ]

Você pode testar facilmente a suposição acima executando: services --status-all 2>/dev/null . Se você tiver algum serviço em execução que suporte o comando status , ele será listado.

    
por lgarzo 21.10.2011 / 09:42