Ответ @GracefulRestart является лучшим, если у вас есть только одна служба в зависимости от доступности базы данных. Однако, если у вас есть несколько служб, для которых есть это требование, создайте одноразовую службу, чтобы все службы могли иметь зависимость Requires=
от:
/etc/systemd/system/portopen@.service
[Unit]
Description=Checks database availability on %I
After=network.target
Requires=network.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/path/to/portopen.sh %I
[Install]
WantedBy=default.target
/путь/к/portopen.sh
#!/bin/bash
dbhost=${1:-localhost}
dbport=${2:-5678}
maxtries=${3:-5}
wait=${4:-10}
tries=1
# Check communication to database
while ! [ 2>/dev/null : < /dev/tcp/$dbhost/$dbport ]; do
echo "Unable to connect to database on $dbhost TCP/$dbport (attempt $tries): retrying in $wait seconds" >&2
(( tries++ ))
if [[ $tries -le $maxtries ]]; then
sleep $wait
else
echo "Unable to connect to database on $dbhost TCP/$dbport: aborting"
exit 1
fi
done
Я сделал скрипт немного более гибким на тот случай, если вы измените или добавите серверы баз данных, или измените порт, или захотите изменить количество повторных попыток на -уровне обслуживания. Если вам это не нужно, просто позвоните в сервис portopen.service
и удалите части %I
.
Допустим, ваш сервер базы данных находится на foobar
и ваше приложение базы данных работает на foobarapp.service
. Внесите следующие изменения вfoobarapp.service
:
# systemctl edit foobarapp.service
[в редакторе]
[Unit]
After=portopen@foobar.service
Requires=portopen@foobar.service
Затем перезагрузите systemd
и запустите и включите проверку:
# systemctl daemon-reload
# systemctl enable portopen@foobar.service
Затем вы можете перезапустить foobarapp.service
в любое время. Он должен запускаться только в случае успешного возврата portopen@foobar.service
.
Если служба приложений базы данных еще не существует, foobarapp.service
она будет выглядеть следующим образом:
/etc/systemd/system/foobarapp.service
[Unit]
Description=Foobar database application
# Add any other dependencies here
After=portopen@foobar.service
Requires=portopen@foobar.service
[Service]
# If it is a daemon, use "forking" instead
Type=simple
ExecStart=/path/to/exec
[Install]
WantedBy=default.target