特定のデバイスでスクリプトを実行する場合は、ベンダー ID と製品 ID を使用できます
-
/etc/udev/rules.d/test.rules
で :ATTRS{idVendor}=="152d", ATTRS{idProduct}=="2329", RUN+="/tmp/test.sh"
-
test.sh
で :#! /bin/sh env >>/tmp/test.log file "/sys${DEVPATH}" >>/tmp/test.log if [ "${ACTION}" = add -a -d "/sys${DEVPATH}" ]; then echo "add ${DEVPATH}" >>/tmp/test.log fi
env
で 、 udev から file
で設定されている環境を確認できます 、ファイルの種類がわかります。
デバイスの具体的な属性は lsusb
で発見できます
lsusb
与える
<ブロック引用>
...
バス 001 デバイス 016:ID 152d:2329 JMicron Technology Corp. / JMicron USA Technology Corp. JM20329 SATA ブリッジ
...
これはあなたの質問に関するものではなく、あなたがしていることに関するものです。 udev からバックアップ スクリプトを開始すると、2 つの主な問題に直面します:
<オール>私のアドバイスは、名前付きパイプをリッスンし、次のように非同期で開始されるスクリプトをユーザー ホームに作成することです。
#!/bin/bash
PIPE="/tmp/IomegaUsbPipe"
REMOTE_PATH="/path/to/mount/point"
LOCAL_PATH="/local/path/"
doSynchronization()
{
#your backup here
}
trap "rm -f $PIPE" EXIT
#If the pipe doesn't exist, create it
if [[ ! -p $PIPE ]]; then
mkfifo $PIPE
fi
#If the disk is already plugged on startup, do a syn
if [[ -e "$REMOTE_PATH" ]]
then
doSynchronization
fi
#Make the permanent loop to watch the usb connection
while true
do
if read line <$PIPE; then
#Test the message read from the fifo
if [[ "$line" == "connected" ]]
then
#The usb has been plugged, wait for disk to be mounted by KDE
while [[ ! -e "$REMOTE_PATH" ]]
do
sleep 1
done
doSynchronization
else
echo "Unhandled message from fifo : [$line]"
fi
fi
done
echo "Reader exiting"
注:kdeで自動マウントを使用しているため、フォルダーが表示されるかどうかを確認します。 /dev/sd* パラメータを udev ルールから fifo に渡し、スクリプトで自分でマウントできます。 fifo に書き込むには、udev がシェルではなく、リダイレクトが機能しないことを忘れないでください。 RUN は次のようになります:
RUN+="/bin/sh -c '/bin/echo 接続>> /tmp/IomegaUsbPipe'"
https://askubuntu.com/a/516336 にソリューションを投稿しました。ここにもソリューションをコピーして貼り付けています。
バックグラウンドで実行したままにする pyudev を使用して Python スクリプトを作成しました。そのスクリプトは udev イベントをリッスンし (したがって、非常に効率的です)、必要なコードを実行します。私の場合、それは xinput
を実行します デバイスをセットアップするためのコマンド (最新バージョンへのリンク)。
以下は、同じスクリプトの短いバージョンです:
#!/usr/bin/env python3
import pyudev
import subprocess
def main():
context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb')
monitor.start()
for device in iter(monitor.poll, None):
# I can add more logic here, to run different scripts for different devices.
subprocess.call(['/home/foo/foobar.sh', '--foo', '--bar'])
if __name__ == '__main__':
main()