
--up
IP 라우팅 정보에 대해 로컬 mysql 데이터베이스를 쿼리한 다음 경로를 적용하는 스크립트를 실행하는 openvpn 터널이 있습니다 . 그러나 openvpn 및 mysql systemd 서비스는 모두 지시문으로 구성되므로 After=network.target
경쟁 조건이 발생합니다. --up
스크립트가 실행될 때 /var/run/mysqld/mysqld.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는 mysqld가 로딩을 완료했는지 여부를 결정하기 위해 sock 파일을 사용하는 것이 아니라 sock 파일이 생성되기 전에 발생하는 몇 가지 기준을 사용하는 것 같습니다.
sock 파일이 생성될 때까지 mysql.service가 시작된 것으로 인식하지 못하도록 systemd에 지시하는 방법이 있습니까?
답변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=에 전달된 절대 경로 이름 앞에 느낌표("!")가 붙으면 테스트가 무효화되고 경로가 존재하지 않는 경우에만 장치가 시작됩니다.