시작 시 systemd 스크립트 실행을 지연할 수 있나요?

시작 시 systemd 스크립트 실행을 지연할 수 있나요?

systemd시작 시 실행하고 싶은 스크립트가 두 개 있습니다 .

  1. 첫 번째 시스템 스크립트는 OpenVPN을 시작한 다음 연결된 IP를 파일에 쓰는 쉘 스크립트를 실행합니다 vpn.env.

  2. 두 번째 시스템 스크립트는 Transmission을 시작하고 Transmission의 IP 주소에 바인딩되어야 합니다 vpn.env.

내 문제는 두 번째 시스템 스크립트가 너무 "빠르게" 실행되어 OpenVPN이 시작하고 쓰기 전에 완료된다는 것입니다 vpn.env.

질문:두 번째 스크립트에 지연(아마도 몇 초)을 추가하고 환경 파일이 기록될 때까지 기다리게 하는 방법이 있습니까?


시스템화된 OpenVPN 스크립트

[Unit]
Description=VPN Custom Launch Connection
After=network.target

[Service]
Type=simple
ExecStart=/usr/sbin/openvpn --cd /etc/openvpn --config /etc/openvpn/vpn.conf

[Install]
WantedBy=multi-user.target

프로그램이 시작될 때 실행되는 OpenVPN .sh 스크립트

printenv > /etc/openvpn/vpn.env

시스템 전송 스크립트

[Unit]
Description=Transmission BitTorrent Daemon Under VPN
After=network.target vpn.service
Requires=vpn.service

[Service]
User=transmission
Type=notify
EnvironmentFile=/etc/openvpn/vpn.env
ExecStart=/usr/bin/transmission-daemon -f --log-error --config-dir /opt/transmission --bind-address-ipv4 $ifconfig_local --rpc-bind-address 0.0.0.0 --no-portmap
ExecReload=/bin/kill -s HUP $MAINPID

[Install]
WantedBy=multi-user.target

답변1

문제는 Type=simpleVPN 서비스에 대한 설명에 있습니다. 이것아치스 위키명확히하다매뉴얼 페이지, 조금:

Type=simple(기본값): systemd서비스가 즉시 시작되도록 고려합니다. 프로세스가 분기되어서는 안 됩니다. 이 서비스에 대해 다른 서비스를 주문해야 하는 경우 소켓이 활성화되지 않는 한 이 유형을 사용하지 마십시오.

유형을 변경하면 이를 달성할 수 있습니다.

Type=oneshot: 이는 단일 작업을 실행한 다음 종료하는 스크립트에 유용합니다. 너가능한또한 프로세스가 종료된 후에도 서비스가 계속 활성 상태로 간주 RemainAfterExit=yes되도록 설정하려고 합니다 .systemd

답변2

지연을 추가할 수 있습니다.https://stackoverflow.com/q/43001223/32453

또는 시스템 OpenVPN 서비스 파일에서 이 작업을 수행할 수 있습니다.

 ExecStartPost=/bin/bash -c 'do_bash_loop_that_waits_till_file_appears_here'

또 다른 옵션: systemd 생성.path 단위 파일. 아마도 vpn.env 파일이 생성되거나 변경될 때마다 트리거될 것입니다.

관련 정보