systemd에서 서비스를 중지하기 위해 udev 규칙을 작성하는 올바른 방법은 무엇입니까


12

Arch Linux를 실행 중이며 장치를 삽입 할 때 서비스를 시작하는 udev 규칙이 있습니다. 이 경우 3G 모뎀이 연결되면 연결에 전화를 겁니다.

KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="netcfg@wvdial.service"

그러나 장치가 제거되면 systemd는 서비스를 중지하지 않으므로 다시 연결하면 이미 실행 중이므로 서비스가 시작되지 않습니다.

필요한 것은 장치를 제거하여 서비스를 중지 할 때 실행되는 일치하는 udev 규칙입니다.

최신 정보

아래 답변을 사용하여 지금 가지고있는 것은 다음 udev 규칙입니다.

KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="vodafone.service"

다음 서비스 파일 (기본적으로 netcfg 서비스 파일에서 복사하여 붙여 넣기)

[Unit]
Description=Netcfg networking service for Vodafone Dongle
Before=network.target
Wants=network.target
BindsTo=dev-gsmmodem.device
After=dev-gsmmodem.device

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/netcfg check-iface wvdial
ExecStop=-/usr/bin/netcfg down wvdial
KillMode=none

[Install]
WantedBy=multi-user.target

내가 사용하고 netcfg-wvdial전화 걸기를 수행 할 AUR에서.

답변:


11

귀하의 서비스가 BindsTo를 필요로 하거나 더 나은 것을 요구 하도록 지정함으로써, systemd만을 사용하여 문제를 해결할 수 있습니다. 주어진 장치.

인용 :

"다른 [필수 / 바운드] 장치 중 하나가 비활성화되거나 활성화에 실패하면이 장치 [서비스]가 비활성화됩니다"

다음과 같이 서비스 파일을 편집하면됩니다.

[Unit]
<...>
BindsTo=<DEVICE UNIT HERE>.device
<...>
After=<DEVICE UNIT HERE>.device

참고 : 사용 가능한 모든 장치 장치 파일 목록을 얻으려면 systemctl list-units --all --full | grep ".device"


이것이 udev 규칙이 필요하지 않다는 것을 의미합니까? netcfg @ wvdial.service를 대체 할 새 서비스 파일을 작성하고 두 줄을 포함하여 제안한대로 시도했습니다. 지금 서비스를 중지하는 것처럼 보이지만 장치를 다시 연결해도 시작되지 않습니다.
crazystick

@ crazystick 당신은 여전히 ​​서비스를 시작하기 위해 udev 규칙이 필요합니다. 내가 의미하는 바는 udev를 사용하여 중지 할 필요가 없다는 것입니다.
brunocodutra

알았다. udev 규칙과 수정 된 서비스 파일 모두에서 매우 잘 작동합니다.
crazystick

2
당신이 사용할 수있는 StopWhenUnneeded=true대신 BindsToAfter
SergA

@ SergA는 내가 대답했을 때 작동 하지 못하게 하는 버그StopWhenUnneeded=true 가 있었지만 지금은 꽤 오랫동안 수정되었다고 생각합니다.
brunocodutra
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.