Olho de Cylon do systemd
Um recurso imbatível do systemd é o olho de Cylon! 🤩
Quando uma unidade está demorando demais para iniciar ou terminar, o systemd exibe, desde a versão 198, esta temível animação:
http://youtu.be/PQfOwtBe9Bs
O limite de tempo para desistir de esperar é de 90s se não for especificado no arquivo de unidade, seguindo a configuração global de
Se não tiver aí nenhum programa mal comportado (ainda bem!), aqui está o código do daemon fajuto que usei:
Compilação/instalação:
O código nada faz. É apenas um loop infinito. Ao receber SIGABRT, termina com exit code 1 (falha). Quando recebe SIGTERM, espera 40 segundos antes de terminar com exit code 0 (sucesso). Ao finalizar os processos durante o desligamento do sistema, a demora faz o systemd acionar o olho de Cylon (o temporizador é de 5 segundos). Podemos observar o comportamento, sem a animação 😥, com:
Veja que, na saída de
Testemos também
Para desinstalar:
Referências:
Battlestar Galactica Original Cylon Centurions
Relacionado:
Modificar parâmetros dos arquivos de unidade do systemd
Básico dos arquivos de unidade do systemd
Ordenação no systemd
systemctl cat/edit
systemctl enable|disable|mask --now
systemctl revert
Quando uma unidade está demorando demais para iniciar ou terminar, o systemd exibe, desde a versão 198, esta temível animação:
http://youtu.be/PQfOwtBe9Bs
O limite de tempo para desistir de esperar é de 90s se não for especificado no arquivo de unidade, seguindo a configuração global de
/etc/systemd/system.conf. Os parâmetros para modificar são DefaultTimeoutStartSec= e DefaultTimeoutStopSec=. Evite mexer na configuração global. Configure em cada unidade quando necessário com TimeoutStartSec=, TimeoutStopSec= e TimeoutSec= (o último configura os anteriores de uma só vez).Se não tiver aí nenhum programa mal comportado (ainda bem!), aqui está o código do daemon fajuto que usei:
fajuto.c#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <systemd/sd-daemon.h>
#include <systemd/sd-journal.h>
const int wait_time = 40;
void signal_handler(int signum)
{
switch(signum)
{
case SIGABRT:
sd_journal_print(LOG_NOTICE, "SIGABRT recebido, saindo com erro.");
exit(EXIT_FAILURE);
break;
case SIGTERM:
sd_journal_print(LOG_NOTICE, "SIGTERM recebido, esperando %ds para sair...", wait_time);
sleep(wait_time);
exit(EXIT_SUCCESS);
break;
}
}
int main(void)
{
signal(SIGABRT, signal_handler);
signal(SIGTERM, signal_handler);
sd_notify(0, "READY=1");
sd_journal_print(LOG_NOTICE, "Fajuto rodando. Passar bem.");
while(1)
;
return EXIT_SUCCESS;
}
/etc/systemd/system/fajuto.service[Unit] Description=Fajuto [Service] Type=notify ExecStart=/usr/local/bin/fajuto [Install] WantedBy=multi-user.target
Compilação/instalação:
# yum -y install gcc glibc-devel systemd-devel $ gcc -o fajuto fajuto.c -lsystemd $ strip fajuto # install fajuto /usr/local/bin
# systemctl daemon-reload # systemctl enable fajuto.service # systemctl start fajuto.service
O código nada faz. É apenas um loop infinito. Ao receber SIGABRT, termina com exit code 1 (falha). Quando recebe SIGTERM, espera 40 segundos antes de terminar com exit code 0 (sucesso). Ao finalizar os processos durante o desligamento do sistema, a demora faz o systemd acionar o olho de Cylon (o temporizador é de 5 segundos). Podemos observar o comportamento, sem a animação 😥, com:
# systemctl --no-block stop fajuto.service
# systemctl status fajuto.service
fajuto.service - Fajuto
Loaded: loaded (/etc/systemd/system/fajuto.service; enabled)
Active: deactivating (stop-sigterm) since Sáb 2014-01-25 19:39:48 BRST; 14s ago
Main PID: 219 (fajuto)
CGroup: /system.slice/fajuto.service
└─219 /usr/local/bin/fajuto
Jan 25 19:37:48 PLUTO systemd[1]: Starting Fajuto...
Jan 25 19:37:48 PLUTO fajuto[219]: Fajuto rodando. Passar bem.
Jan 25 19:37:48 PLUTO systemd[1]: Started Fajuto.
Jan 25 19:39:48 PLUTO systemd[1]: Stopping Fajuto...
Jan 25 19:39:48 PLUTO fajuto[219]: SIGTERM recebido, esperando 40s para sair...
Veja que, na saída de
systemctl status, o estado do serviço ficará em deactivating (stop-sigterm) durante os 40 segundos até o programa finalizar.Testemos também
systemctl kill:# systemctl start fajuto.service # systemctl kill --signal=SIGABRT fajuto.service # systemctl status fajuto.service fajuto.service - Fajuto Loaded: loaded (/etc/systemd/system/fajuto.service; enabled) Active: failed (Result: exit-code) since Sáb 2014-01-25 19:42:43 BRST; 8s ago Process: 701 ExecStart=/usr/local/bin/fajuto (code=exited, status=1/FAILURE) Main PID: 701 (code=exited, status=1/FAILURE) Jan 25 19:41:52 PLUTO fajuto[701]: Fajuto rodando. Passar bem. Jan 25 19:41:52 PLUTO systemd[1]: Started Fajuto. Jan 25 19:42:43 PLUTO fajuto[701]: SIGABRT recebido, saindo com erro. Jan 25 19:42:43 PLUTO systemd[1]: fajuto.service: main process exited, code=exited, status=1/FAILURE Jan 25 19:42:43 PLUTO systemd[1]: Unit fajuto.service entered failed state.
SuccessExitStatus=1 na seção [Service], por exemplo, faria o systemd considerar exit code 1 como sucesso e o serviço não entraria em estado de falha.Para desinstalar:
# systemctl disable --now fajuto.service # rm -f /usr/local/bin/fajuto # rm -f /etc/systemd/system/fajuto.service # systemctl daemon-reload
Referências:
Battlestar Galactica Original Cylon Centurions
Relacionado:
Modificar parâmetros dos arquivos de unidade do systemd
Básico dos arquivos de unidade do systemd
Ordenação no systemd
systemctl cat/edit
systemctl enable|disable|mask --now
systemctl revert
Comentários
Postar um comentário