Linux - Vários status de serviço com um comando

2

Estou tentando recuperar uma lista de vários status de serviço no Unix. Estou usando o comando service : página do manual .

Todos os status começam com a string transmission-daemon , por exemplo.

Eu preciso da capacidade de listar vários status de serviços, com um único comando . Aqui está o que eu estou tentando atualmente (e falhando):

Aqui estou tentando obter uma lista de status usando grep .

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

Aqui estou tentando listar todos os status e, em seguida, grep para eles.

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

Isso produz o seguinte, o que não ajuda muito:

Como posso efetivamente alcançar o que eu preciso com um único comando, para que eu possa continuar a canalizar para awk para personalização adicional?

Saída de exemplo desejado:

transmission-daemon started
transmission-daemon2 stopped
transmission-daemon3 started
    
por James 01.07.2013 / 22:58

3 respostas

6

Eu não tenho muito a dizer, exceto que:

  • Sua coisa ls | grep parece muito estranha e errada para mim
  • Para resolver o seu problema de grep , será que service é enviado para stderr ? Que tal com um redirecionamento de stderr para stdout ?

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

(mas isso também parece muito estranho e errado para mim).

Aparentemente, você quer executar seus serviços com o comando status , certo? Que tal usar bash assim:

#!/bin/bash

shopt -s nullglob

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

Em uma linha:

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

Isso dá:

Espero que isso o coloque no caminho certo (ou pelo menos em um caminho melhor)!

    
por 01.07.2013 / 23:09
1

Outra opção seria usar a opção find de -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.

Especificamente (dividido por legibilidade):

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

E em uma linha:

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

Achei assim o mais fácil de lembrar:

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

Tags