Script para notificar o status dos serviços do sistema no login

0

Gostaria de obter um script (bash ou python) em execução que imprime em um formato simples o estado de todos os serviços do sistema quando um usuário faz login.

service --status-all

O comando acima mostra todos eles em uma lista como

[+] servicename
[?] servicename
[-] servicename

Quando um usuário faz o login, o script deve fornecer uma mensagem legível sobre os serviços que estão sendo executados.

Eu entendo que pode haver utilitários para fazer isso, mas eu quero aprender um pouco mais sobre scripts e como uma coisa pode ser feita.

Qualquer ajuda é muito apreciada.

    
por jamieg 26.01.2017 / 12:47

1 resposta

2

Se você quiser uma saída como:

The following services are running: ntp, rsync, ssh, 

Você pode usar awk para transformar a saída de service --status-all :

$ service --status-all | awk '/+/{printf "%s", sep " " $NF; sep=","}'
 acpid, alsa-utils, apache-htcacheclean, apache2, apparmor, apport, atd, avahi-daemon, cron, cups-browsed, dbus, grub-common, irqbalance, keyboard-setup, kmod, lightdm, network-manager, networking, ondemand, procps, rc.local, resolvconf, rsyslog, speech-dispatcher, ssh, udev, ufw, urandom, whoopsie

Assim, o seu script ficaria assim:

#! /bin/sh
printf "The following services are running: " 
service --status-all | awk '/+/{printf "%s", sep " " $NF; sep=","}'
echo

O comando awk é simples:

  • /+/ corresponde a linhas com + . Normalmente, + significaria uma ou mais da expressão anterior. Mas, por si só, + significa apenas + . O awk executa o seguinte bloco {...} se esse padrão corresponder.
  • printf "%s" sep " " $NF imprime o conteúdo da variável sep , seguido por um espaço e seguido pelo último campo da linha ( NF é o número de campos e $x é o conteúdo do campo x.) .
  • sep está vazio no início, então o primeiro serviço a ser impresso tem apenas um espaço antes dele. Agora eu defino sep="," , então, na próxima linha, temos um , .
  • Isso não imprime uma nova linha, então eu uso um simples echo no final para imprimir um.

Agora use algo como isto: Execute o script no login do shell para todos os usuários para executar o script no login.

    
por muru 26.01.2017 / 13:27