Eu tenho sistemas Centos 7+ e todos eles usam systemd. Às vezes, a melhor maneira de proceder após uma alteração importante do sistema é reiniciar cada serviço em execução no momento. Se eu reiniciar cada serviço um de cada vez, o sistema geralmente permanece online e é muito fácil ver os problemas de serviço à medida que eles aparecem. Então eu hackeei este pequeno script bash, que reinicia cada serviço systemd em execução, EXCETO certos serviços nomeados que eu acho que são essenciais para manter a caixa online.
#!/bin/bash
set -e
set -u
running=$(systemctl list-units --type service | grep running \
| grep -iv audit \
| grep -iv disk \
| grep -iv drive \
| grep -iv getty \
| grep -iv irq \
| grep -iv libstoragemgt \
| grep -iv lvm \
| grep -iv multipath \
| grep -iv polkit \
| grep -iv storage \
| cut -d' ' -f1)
for service in $running ; do
echo "$service"
systemctl restart "$service"
done
Há várias coisas que eu gostaria que fossem melhores:
- Grepping para "executar" é uma maneira grosseira de filtrar tarefas em execução, e os vários tubos são bastante caros.
- O uso
cut
é realmente frágil e quebra quando o formato de saída do systemd muda. systemctl restart
não define um código de retorno na falha de inicialização, portanto, o script continua funcionando mesmo se um serviço falhar ao parar ou iniciar.
Quais podem ser algumas maneiras melhores para isso?
Reinicie o servidor :)
Reiniciar todos os serviços raramente é uma boa ideia. Ou você está atualizando todo o sistema e quer ter certeza de que tudo usa as bibliotecas corrigidas mais recentes. Ou você está atualizando/reconfigurando apenas um serviço e então um simples
systemctl reload whatever.service
deve ser suficiente, não há necessidade de reiniciar todos os serviços em execução.Além disso, é uma boa ideia reinicializar o servidor de tempos em tempos para garantir que ele realmente seja reinicializável. Já vi servidores com anos de uptime que ninguém se atreve a reiniciar porque ninguém sabe se eles realmente voltarão a funcionar, quais alterações foram feitas e não salvas, etc.
Se for um sistema crítico , certamente está em algum cluster de alta disponibilidade e a reinicialização de um nó não importa. Se não for um sistema crítico, você pode reiniciá-lo, mesmo que após o horário comercial ou no fim de semana.
Então, para responder à sua pergunta - reinicie o servidor
Para melhorar seu código, você pode fazer o seguinte:
--state running
em vez degrep running
filtrar os serviços que você precisa.grep -v -f exclude-services.list
em vez de uma cadeia degrep
'ssystemctl try-restart s1 s2 s3 ...
tudo de uma vez em vez de percorrer a lista.Primeiro, liste os serviços a serem excluídos em
exclude-services.list
:Então este script deve funcionar:
Isso pode ser um pouco mais robusto do que o seu script. Deixe-me saber como vai.