@removeを呼び出すudev systemdは機能しませんが、openSuse Leap42.3スクリプトを起動します。

@removeを呼び出すudev systemdは機能しませんが、openSuse Leap42.3スクリプトを起動します。

こんにちは、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から呼び出されたシェルスクリプトを使用すると、コマンドを直接実行することはできません。umountUDEVで直接実行したときと同じエラーが発生するためです/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ルールがトリガーしていない理由を説明します。

関連情報