Cách chính xác để viết quy tắc udev để dừng dịch vụ theo systemd là gì


12

Tôi đang chạy Arch Linux và tôi có quy tắc udev khởi động dịch vụ khi thiết bị được chèn. Trong trường hợp này, nó sẽ quay số kết nối khi cắm modem 3G.

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

Tuy nhiên, nếu thiết bị bị xóa, systemd sẽ không dừng dịch vụ và do đó khi thiết bị được cắm lại, nó sẽ không khởi động dịch vụ, vì nó đã chạy.

Những gì tôi cần là một quy tắc udev phù hợp chạy khi thiết bị được gỡ bỏ để dừng dịch vụ.

Cập nhật

Sử dụng câu trả lời dưới đây, những gì tôi có bây giờ là quy tắc udev sau đây

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

với tệp dịch vụ sau (về cơ bản đã được sao chép và dán từ tệp dịch vụ 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

Tôi đang sử dụng netcfg-wvdialtừ AUR để thực hiện quay số.

Câu trả lời:


11

Vấn đề của bạn có thể được giải quyết chỉ bằng systemd, bằng cách chỉ định rằng dịch vụ của bạn Yêu cầu hoặc thậm chí tốt hơn, BindsTo thiết bị đã cho.

Trích dẫn:

"Nếu một trong các đơn vị [bắt buộc / ràng buộc] khác bị hủy kích hoạt hoặc kích hoạt không thành công, đơn vị [dịch vụ] này sẽ bị hủy kích hoạt"

Bạn chỉ cần chỉnh sửa tập tin dịch vụ của bạn như sau.

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

Lưu ý: để có danh sách tất cả các tệp đơn vị thiết bị có sẵn, hãy sử dụng systemctl list-units --all --full | grep ".device"


Điều này có nghĩa là tôi không cần quy tắc udev? Tôi đã cố gắng làm như bạn đề xuất, bằng cách tạo một tệp dịch vụ mới để thay thế netcfg @ wvdial.service và bao gồm cả hai dòng đó. Nó dường như dừng dịch vụ ngay bây giờ, nhưng nó không khởi động khi thiết bị được cắm lại.
crazystick

@crazystick bạn vẫn cần quy tắc udev để bắt đầu dịch vụ, ý tôi là bạn sẽ không cần sử dụng udev để ngăn chặn nó.
brunocodutra

Hiểu rồi. Hoạt động rất độc đáo với cả quy tắc udev và tệp dịch vụ đã sửa đổi.
crazystick

2
Bạn có thể sử dụng StopWhenUnneeded=truethay thế BindsToAfter
SergA

@SergA vào thời điểm tôi trả lời thì có một lỗi ngăn StopWhenUnneeded=truekhông hoạt động, nhưng tôi tin rằng nó đã được sửa khá lâu rồi.
brunocodutra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.