Eu tenho um script de notificação iniciado pelo processo daemon keepalived sempre que seu estado muda.
O problema é que a saída de eco do meu script de notificação não aparece na saída exibida ao executar keepalived com a opção -l (registrar no console local)
Normalmente, eu poderia gravar essa saída em um arquivo e isso seria uma boa solução, exceto que, neste caso, o daemon keepalived está sendo executado em um contêiner docker e eu quero que o daemon docker veja o log de todas as saídas, incluindo as da minha notificação roteiro.
Isto é o que eu tentei para o meu script de notificação:
#!/bin/bash
MY_PPID=$(ps -o ppid= $$)
MY_PPID=${MY_PPID// }
function echo
{
builtin echo $(date +"%b %e %H:%M:%S"): $1 >> /proc/${MY_PPID}/fd/0
}
echo "Notify state=$3"
E a saída do keepalived:
Starting VRRP child process, pid=8847
Interface queue is empty
No such interface, ib0
No such interface, ib1
No such interface, docker0
Interface queue is empty
No such interface, ib0
Registering Kernel netlink reflector
No such interface, ib1
No such interface, docker0
Registering Kernel netlink command channel
Registering gratuitous ARP shared channel
Registering Kernel netlink reflector
Initializing ipvs 2.6
Registering Kernel netlink command channel
Opening file '/etc/keepalived/keepalived.conf'.
Configuration is using : 5879 Bytes
Opening file '/etc/keepalived/keepalived.conf'.
Configuration is using : 61747 Bytes
Using LinkWatch kernel netlink reflector...
Using LinkWatch kernel netlink reflector...
VRRP_Instance(vip) Transition to MASTER STATE
VRRP_Instance(vip) Entering MASTER STATE
Opening script file /etc/keepalived/notify.sh
Se funcionasse, eu esperaria ver uma linha adicional:
Notify state=MASTER
Mas obviamente não funcionou. Alguma idéia de como eu poderia fazer isso funcionar corretamente?
Acho que encontrei o problema. MY_PPID não existe mais como um processo. Parece que, ao executar o script, o processo keepalived faz uma bifurcação dupla para desanexar o script. Quando escrevo no fd de um dos processos de manutenção de vida, ele funciona. Posso obter o pid do arquivo /var/run/keepalived.pid.
Vou tentar isso e retorno.
Por quê
/proc/${MY_PPID}/fd/0
? Geralmente é a saída do console...Você pode identificar o arquivo de log no
/proc/${MY_PPID}/fd/
processo do supervisord?Acontece que não funciona porque keepalived faz um fork duplo antes de chamar exec no script filho. Portanto, MY_PPID não é mais um ID de processo válido.
A solução é obter o id correto usando o arquivo /var/run/vrrp.pid.
Isso funciona: