O script atual:
start on (net-device-up
and local-filesystems
and runlevel [2345]
and started rsyslog)
stop on runlevel [!2345]
respawn
exec /usr/sbin/openvpn --config /etc/openvpn/devops/config
O problema é se ele não foi iniciado por alguns motivos:
Sep 24 01:55:07 p vpn-devops[5075]: Cannot load certificate file /etc/openvpn/devops/server.crt: error:02001002:system library:fopen:No such file or directory
: error:20074002:BIO routines:FILE_CTRL:system lib: error:140AD002:SSL routines:SSL_CTX_use_certificate_file:system lib
Sep 24 01:55:07 p vpn-devops[5075]: Exiting
O Upstart ainda acha que é iniciado e sai com o status 0 imediatamente.
Minha primeira tentativa:
post-start script
for try in $(seq 9); do
if [ nc -q0 -zu localhost 1194 ]; then
exit 0
fi
sleep 1
done
exit 1
end script
Eu pensei que isso funcionaria, mas na verdade não é. O motivo é o código de saída é ignorado no post-start
.
Minha segunda tentativa:
expect fork
respawn
pre-start script
/usr/sbin/openvpn --config /etc/openvpn/devops/config
if [ $? -ne 0 ]; then
exit 1
fi
end script
script
while kill -0 $(cat /var/run/openvpn/devops.pid); do
sleep 1
done
end script
Agora, o status de saída está correto em caso de falha:
start openvpn-devops
start: Job failed to start
echo $?
1
mas start
trava (não retorna o prompt do shell) no caso normal, embora o pid esteja rastreando corretamente:
status openvpn-devops
openvpn-devops start/pre-start, process 7565
cat /var/run/openvpn/devops.pid
7565
O mesmo aconteceu se eu usar:
expect daemon
/usr/sbin/openvpn --config /etc/openvpn/devops/config --daemon
Minha terceira tentativa:
expect fork
exec /usr/sbin/openvpn --config /etc/openvpn/devops/config --daemon
então start
funcionou, mas rastreou o pid errado porque o número de garfos não está correto:
start openvpn-devops
openvpn-devops start/running, process 7720
status openvpn-devops
openvpn-devops start/running, process 7720
cat /var/run/openvpn/devops.pid
7715
ps -ef | grep vpn
nobody 7715 1 0 02:41 ? 00:00:00 /usr/sbin/openvpn --config /etc/openvpn/devops/config --daemon
O que eu fiz de errado?