GNU/Linux >> Linux の 問題 >  >> Linux

USB デバイスを接続するときにシェルスクリプトを実行する方法

特定のデバイスでスクリプトを実行する場合は、ベンダー 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 つの主な問題に直面します:

<オール>
  • デバイスの準備ができてマウントできるようになる前に、スクリプトが開始される可能性があります。/dev ノードを使用してマウントする場合は、KERNEL=="sd*" 条件を維持する必要があります
  • さらに重要なことは、スクリプトの実行に時間がかかる場合 (バックアップ スクリプトの場合は簡単にそうなる可能性があります)、開始後すぐに (約 5 秒) スクリプトが強制終了されます
  • 多くの複雑なユーザー権限の問題に直面するでしょう
  • 私のアドバイスは、名前付きパイプをリッスンし、次のように非同期で開始されるスクリプトをユーザー ホームに作成することです。

    #!/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()
    

    Linux
    1. 再起動または起動時にコマンド/スクリプトを自動実行する方法

    2. Bashスクリプトの変数に改行を追加する方法は?

    3. USBデバイスが削除されたときにシェルスクリプトでイベントをトリガーする方法は?

    1. ショートカットキーが押されたときにシェルでスクリプトを実行するにはどうすればよいですか?

    2. デスクトップショートカットからShスクリプトを実行する方法は?

    3. UDEV を使用して USB デバイスが接続または削除されたときにスクリプトを実行する方法

    1. USBデバイスプラグインでカスタムスクリプトを実行する方法は?

    2. Linuxでユーザーがログインする前にコマンドを実行する方法は?

    3. 検索を使用するときに複数のコマンドを実行するにはどうすればよいですか?