GNU/Linux >> Znalost Linux >  >> Linux

Jak spustit shellscript, když připojím USB zařízení

Pokud chcete skript spustit na konkrétním zařízení, můžete použít ID dodavatele a produktu

  • V /etc/udev/rules.d/test.rules :

    ATTRS{idVendor}=="152d", ATTRS{idProduct}=="2329", RUN+="/tmp/test.sh"
    
  • v 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
    

S env , můžete vidět, jaké prostředí je nastaveno z udev a pomocí file , zjistíte typ souboru.

Konkrétní atributy pro vaše zařízení lze zjistit pomocí lsusb

lsusb

dává

...
Bus 001 Device 016:ID 152d:2329 JMicron Technology Corp. / JMicron USA Technology Corp. JM20329 SATA Bridge
...


Nejde přímo o vaši otázku, ale o to, co děláte. Pokud spustíte zálohovací skript z udev, budete čelit dvěma hlavním problémům:

  1. Váš skript může být spuštěn dříve, než bude zařízení připraveno a bude možné jej připojit, pokud chcete k připojení použít uzel /dev, musíte zachovat podmínku KERNEL=="sd*"
  2. Důležitější je, že pokud spuštění vašeho skriptu nějakou dobu trvá (což může být snadno případ záložního skriptu), bude ukončen krátce po jeho spuštění (asi 5 s)
  3. Budete čelit mnoha komplikovaným problémům s uživatelskými oprávněními

Moje rada je vytvořit skript ve vašem uživatelském domově, který naslouchá pojmenovanému kanálu a který bude spuštěn asynchronně jako:

#!/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"

Poznámka:Používám automatické připojení s kde, takže zkontroluji, zda se složka zobrazuje. Parametr /dev/sd* můžete předat do fifo z pravidla udev a sami jej připojit do skriptu. Chcete-li napsat do fifo, nezapomeňte, že udev není shell a že nefunguje přesměrování. Váš RUN by měl být takto:

RUN+="/bin/sh -c '/bin/echo připojeno>> /tmp/IomegaUsbPipe'"


Uveřejnil jsem řešení na https://askubuntu.com/a/516336 a řešení také zkopíruji a vložím sem.

Napsal jsem skript Python pomocí pyudev, který nechávám běžet na pozadí. Tento skript poslouchá události udev (je tedy velmi efektivní) a spouští jakýkoli kód, který chci. V mém případě běží xinput příkazy pro nastavení mých zařízení (odkaz na nejnovější verzi).

Zde je krátká verze stejného skriptu:

#!/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. Jak spustit skript po ukončení relace xfce

  2. Jak spustit Python skript z Javy?

  3. Jak mohu provést více příkazů při použití funkce find?

  1. Spustit skript/program při změně souboru

  2. Jak spustit skript, když pošta dorazí na poštovní server? (Debian)

  3. Systemd :Jak spustit skript pouze při vypnutí (ne při restartu)

  1. Jak automaticky spouštět příkazy/skripty během restartu nebo spouštění

  2. Jak spouštět vlastní skripty na zásuvném modulu USB zařízení?

  3. Jak provést příkaz před přihlášením uživatele v systému Linux?