
У меня есть туннель openvpn, который запускает --up
скрипт, который запрашивает у локальной базы данных mysql информацию об IP-маршрутизации, а затем применяет маршруты. Однако, поскольку обе службы openvpn и mysql systemd настроены с помощью директивы After=network.target
, у меня есть состояние гонки: /var/run/mysqld/mysqld.sock может существовать во время --up
выполнения скрипта, а может и не существовать. Если файл sock не существует, то мой скрипт умирает, и система не инициализируется должным образом.
Я думал, что изменение директивы openvpn.service на After=network.target mysql.service
и запуск systemctl daemon-reload
сработает. Однако я добавил ls -lh /var/run/mysqld/mysqld.sock
в начало скрипта --up
, и он все еще иногда сообщает ls: cannot access '/var/run/mysqld/mysqld.sock': No such file or directory
.
Я предполагаю, что systemd не использует файл sock для определения того, завершил ли mysqld загрузку, а использует некие критерии, которые выполняются до создания файла sock.
Есть ли способ заставить systemd не распознавать mysql.service как запущенный, пока не будет создан файл sock?
решение1
У меня была та же проблема, запустил какую-то другую службу после запуска MySQL
Сначала я отключаю свою услугу
systemctl disable rfid-server
После этого я изменил свой файл rfid-server.service
[Unit]
Description=rfid server
After=mysql.service
[Service]
ExecStart=/opt/rfid-server-service/deploy/start.sh
[Install]
WantedBy=multi-user.target mysql.service
Затем я снова включаю свою услугу.
systemctl enable /complete/path/to/service
Created symlink from /etc/systemd/system/multi-user.target.wants/rfid-server.service to /opt/rfid-server-service/rfid-server.service.
Created symlink from /etc/systemd/system/mysql.service.wants/rfid-server.service to /opt/rfid-server-service/rfid-server.service.
Created symlink from /etc/systemd/system/rfid-server.service to /opt/rfid-server-service/rfid-server.service.
Как вы можете видеть, он создает символическую ссылку на mysql.service.wants
решение2
Может быть, вам следует добавить ConditionPathExists
проверку в свой сервисный файл?
Есть цитата из systemdдокументация:
С ConditionPathExists= условие существования файла проверяется перед запуском модуля. Если указанное абсолютное имя пути не существует, условие не будет выполнено. Если абсолютное имя пути, переданное в ConditionPathExists=, имеет префикс в виде восклицательного знака ("!"), тест отрицается, и модуль запускается только в том случае, если путь не существует.