こんにちは、USBドライブが削除されたときにマウント解除するシステムサービスを呼び出すUDEVルールがあります。
ACTION=="remove", KERNEL=="sd*" SUBSYSTEMS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", ENV{SYSTEMD_WANTS}="umount_extern_backup.service"
問題は、USBドライブを物理的に取り外すとsystemdサービスが実行されないことです。
同じUDEVルールを使用する場合
ACTION=="remove", KERNEL=="sd*" SUBSYSTEMS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", RUN+="/bin/umount -l /extern-backup"
コマンドを直接実行すると/bin/umount -l /extern-backup
実行されますが、エラーが発生します。
udevd[10181]: Process '/bin/umount -l /extern-backup' failed with exit code 32.
umountコマンドが機能するため、systemdサービスを実行しようとしています。
シェルスクリプトを実行するためにUDEVルールを変更すると、次のように動作します。
ACTION=="remove", KERNEL=="sd*" SUBSYSTEMS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", RUN+="/usr/local/sbin/test.sh"
test.shが実行されます。ただし、UDEVから呼び出されたシェルスクリプトを使用すると、コマンドを直接実行することはできません。umount
UDEVで直接実行したときと同じエラーが発生するためです/bin/umount -l /extern-backup
。
サービスを手動で呼び出す場合systemctl start umount_extern_backup.service
にも機能します。
ケーキにアイシングを追加するためにUDEVルールをにACTION=="remove"
置き換えるとACTION=="add",
、systemdサービスが実行され、USBデバイスを接続するときに削除しようとします。
これは私のシステムサービスです。
[Unit]
Description=umount lazy /extern-backup service
[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/bin/umount -l /extern-backup
[Install]
WantedBy=multi-user.target
答え1
RUN+="/usr/bin/systemctl umount_extern_backup.service"
上記のコメントで述べたように動作します。
SYSTEMD_WANTS
デバイスのプロパティを確認しましたここ彼らは書いた:
systemdは、デバイスに依存関係が必要な場合にのみ機能します。 まず活発に活動する。すでにアクティブなデバイスに追加されている場合は機能しません。
これは、このadd
ルールがsystemdサービスをトリガーしたが、このremove
ルールがトリガーしていない理由を説明します。