2

Я пытаюсь получить список нескольких статусов службы в Unix. Я использую service команду: man page.

Например, все статусы начинаются со строки transmission-daemon .

Мне требуется возможность перечислять статусы нескольких служб с помощью одной команды. Вот что я сейчас пытаюсь (и терплю неудачу) с:

Здесь я пытаюсь получить список статусов, используя grep .

service $(ls /etc/init.d | grep "transmission-daemon") status

Здесь я пытаюсь перечислить все статусы, а затем grep для них.

service --status-all | grep "transmission-daemon"

Это приводит к следующему, что не очень помогает:

Несколько демонов передачи через grep и сервис --status-all

Как я могу эффективно достичь того, что мне нужно, с помощью одной команды, чтобы я мог затем продолжить пайпинг в awk для дальнейшей настройки?

Требуемый пример вывода:

transmission-daemon started
transmission-daemon2 stopped
transmission-daemon3 started

3 ответа3

6

Мне нечего сказать, кроме этого:

  • Ваш ls | grep вещь кажется мне действительно неловкой и неправильной
  • Чтобы решить вашу проблему с grep , service выводит на stderr? Как насчет перенаправления stderr в stdout?

    service --status-all 2>&1 | grep "transmission-daemon"
    

(но делать это также кажется мне очень неловким и неправильным).


Видимо, вы хотите запустить свои службы с помощью команды состояния , верно? Как насчет использования так:

#!/bin/bash

shopt -s nullglob

for s in /etc/init.d/transmission-daemon* ; do
    service "$(basename "$s")" status
done

В одной строке:

bash -c 'shopt -s nullglob; for s in /etc/init.d/transmission-daemon* ; do service "$(basename "$s")" status; done'

Это дает:

Надеюсь, что это приведет вас на правильный путь (или, по крайней мере, на лучший)!

1

Другим вариантом будет использование опции find 's -exec :

-exec command ;
     Execute command; true if 0 status is returned.  All following arguments to
     find are taken to be arguments to the command until an argument consisting 
     of `;' is encountered.  The string '{}' is replaced by the current file 
     name being processed everywhere it occurs in the arguments to the command, 
     not just in arguments where it is alone, as in some versions of find. Both
     of these constructions might need to be escaped (with a '\') or quoted to 
     protect them from expansion by the shell.

В частности (разделить на разборчивость):

find /etc/init.d/ -name "transmission-daemon*" \
  -exec bash -c 'service $(basename "{}") status' \;

И на одной строке:

find /etc/init.d/ -name "transmission-daemon*" -exec bash -c 'service $(basename "{}") status' \;
0

Я нашел этот способ легче всего запомнить:

for s in /etc/init.d/transmission-daemon*; do service $(basename $s) status; done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .