当前脚本:
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:只需坚持当前脚本。