在 SysV 中,我可以使用条件来确保应用程序在数据库启动并运行之前不会尝试启动。我给init脚本一些时间等待,如果数据库服务仍然不可用,则在一段时间后最终放弃。
start() {
local exec=/path/to/exec
local tries=1
[ -x $exec ] || exit 5
echo -n $"Starting $prog: "
#check communication to database
if ! [ 2>/dev/null : < /dev/tcp/$dbHost/$dbPort ]
then
while ! [ 2>/dev/null : < /dev/tcp/$dbHost/$dbPort ] && [ ! $tries -ge 5 ]
do
>&2 echo -e "Could not connect to the database on $dbHost\nWaiting 10 seconds to check database status, attempt $tries"
sleep 10
((tries++))
done
sleep 10
if ! (: < /dev/tcp/$dbHost/$dbPort ) 2>/dev/null
then
>&2 echo -e "Could not connect to the database on $dbHost aborting startup of $exec"
exit 1
fi
fi
我一直在文档和谷歌中寻找类似的场景,但没有找到任何不引用本地服务的内容。
如果您只有一项服务,则@GracefulRestart 的答案是最好的,具体取决于数据库的可用性。但是,如果您有多个具有此要求的服务,请创建一个单一服务,然后所有服务都可以
Requires=
依赖于:/etc/systemd/system/[email protected]
/path/to/portopen.sh
如果您更改或添加数据库服务器,或端口更改,或者您想更改每个服务级别的重试次数,我使脚本更加灵活。如果您不需要,只需致电服务部门
portopen.service
并卸下%I
零件即可。假设您的数据库服务器已打开
foobar
,并且您的数据库应用程序运行在foobarapp.service
. 对 进行以下更改foobarapp.service
:[在编辑器中]
然后重新加载
systemd
并启动并启用检查:然后,您可以随时重新启动
foobarapp.service
。它应该仅在[email protected]
成功返回时启动。如果它不存在,那么数据库应用程序服务
foobarapp.service
将如下所示:/etc/systemd/system/foobarapp.service
您是否查看过systemd 服务文档中的 ExecStartPre?
我建议将您的数据库测试放在一个脚本中,让它
exit 0
在成功和exit 1
失败时使用,然后使用ExecStartPre
. 然后,您将使用ExecStart
.