如何使用 Upstart 正确启动延迟作业?

如何使用 Upstart 正确启动延迟作业?

当前脚本:

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

问题是如果它由于某些原因而无法启动:

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

Upstart 仍然认为它已启动并立即以 0 状态退出。

我的第一次尝试:

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

我以为它会起作用,但实际上并非如此。原因是退出代码被忽略在里面post-start

我的第二次尝试:

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

现在,如果发生失败,退出状态是正确的:

start openvpn-devops
start: Job failed to start

echo $?
1

start在正常情况下会挂起(不返回 shell 提示符),尽管 pid 跟踪正确:

status openvpn-devops
openvpn-devops start/pre-start, process 7565

cat /var/run/openvpn/devops.pid
7565

如果我使用,也会发生同样的事情:

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

我的第三次尝试:

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

然后就start可以工作了,但是它跟踪了错误的 pid,因为分叉的数量不正确:

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

我做错了什么?

答案1

当前脚本是正确的,它执行了它应该执行的操作。

第二个脚本永远挂起,因为/usr/sbin/openvpn --config /etc/openvpn/devops/config它永远不会退出,而是在前台运行。

第三个脚本也挂起,但是因为openvpn --daemon只分叉一次。

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

已将其更改为expect fork如果配置文件正确则可工作。如果配置文件错误,openvpn 将不会分叉,因此无法正常工作。

TL;DR:只需坚持当前脚本。

相关内容