Lightdm service - resultados contraditórios para o comando 'status'

5

Quando eu corro no meu terminal gnome:

service lightdm status

tudo parece OK e é como esperado:

lightdm start/running, process 1221

Mas quando eu corro:

service --status-all 2>&1 | grep lightdm

a saída é:

 [ ? ]  lightdm

que, por causa de ? , AFAIK significa que o serviço lightdm não possui um comando status .

Agora eu quero entender de onde vieram esses resultados contraditórios? Isso é um bug?

    
por Radu Rădeanu 21.03.2014 / 18:21

1 resposta

3

Isso parece ser um bug no script service . O comportamento é diferente para --status-all do que para um único processo. Para um único processo, service usa apenas exec para passar para o próprio script de inicialização (nesse caso, /etc/init.d/lightdm ). Aqui está o snippet relevante:

if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
   exec env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" ${ACTION} ${OPTIONS}

Para --status-all , ele tenta analisar a saída do próprio script init.d . Baixando o pacote sysvinit-tools para o Ubuntu 13.10 e comparando com a minha versão (Debian Jessie), você pode ver que houve uma mudança nessa parte do código (o mais provável é que isso corrija exatamente esse tipo de erro). Compare este trecho (Ubuntu 13.10) (marquei as linhas alteradas com #<<< :

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 "\(^\|\W\)status)" "$SERVICE"; then     #<<<
                   #printf " %s %-60s %s\n" "[?]" "$SERVICE:" "unknown" 1>&2
                   echo " [ ? ]  $SERVICE" 1>&2
                   continue

e

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
                 out=$(env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1)  #<<<
                 retval=$?                                                   #<<<
                 if echo "$out" | egrep -iq "usage:"; then                   #<<<
                   #printf " %s %-60s %s\n" "[?]" "$SERVICE:" "unknown" 1>&2
                   echo " [ ? ]  $SERVICE" 1>&2
                   continue
    
por 22.03.2014 / 14:09