Como iniciar um trabalho de atraso corretamente usando o Upstart?

1

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?

    
por quanta 24.09.2015 / 04:45

1 resposta

1

O script atual está correto, ele faz o que deve fazer.

O segundo script trava para sempre porque /usr/sbin/openvpn --config /etc/openvpn/devops/config nunca sai, ele é executado em primeiro plano.

O terceiro script também trava, mas porque openvpn --daemon apenas bifurca uma vez.

expect daemon /usr/sbin/openvpn --config /etc/openvpn/devops/config --daemon

A alteração para expect fork funcionará se o arquivo de configuração estiver correto. Se o arquivo de configuração estiver errado, o openvpn não irá funcionar, então não funcionará corretamente.

TL; DR: basta seguir o script atual.

    
por favadi 24.09.2015 / 06:34