나는 매우 간단한 서비스를 작성했습니다.
[Unit]
Description=Service on interface %I
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/lib/project/my_script.sh start %I
[Install]
WantedBy=multi-user.target
나는 네트워크 인터페이스가 어디에 있는지 systemclt start myservice@net0
생각 하기 시작했습니다. net0
네트워크 인터페이스가 다시 시작될 때마다 서비스를 다시 시작하려면 어떻게 해야 합니까?
답변1
다음과 같이 시스템 장치가 해당 인터페이스에 대한 장치의 해당 네트워크 인터페이스(자동 로드) 에 바인딩( BindTo
) 및 종속( DependsOn
) 되도록 할 수 있습니다 ..device
[Unit]
Description=Service on interface %I
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/lib/project/my_script.sh start %I
[Install]
WantedBy=multi-user.target
사용자 지정 장치에 네트워크 인터페이스가 있어야 하는 경우 Wants
다음을 추가하여 장치의 종속성을 공식화할 수 있습니다.After
실제로 온라인섹션에 다음을 추가하면 됩니다 [Unit]
.
Wants=network-online.target
After=network-online.target
참고: 를 실행하여 단위를 확인할 수 있습니다 .device
.loaded
systemctl list-units --type=device
답변2
어쩌면 이것이 효과가 있을 수도 있습니다:https://clinta.github.io/run-service-on-ip-change/
# /etc/systemd/system/ip-change-mon.service
[Unit]
Description=IP Change Monitor
Wants=network.target
After=network-online.target
[Service]
ExecStart=:/bin/bash -c "ip mon addr | sed -nu -r
\'s/.*[[:digit:]]+:[[:space:]]+([^[:space:]]+).*/\\1/p\' | while read iface; do
systemctl restart ip-changed@${iface}.target; done"
[Install]
WantedBy=multi-user.target default.target