GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguire uno shellscript quando collego un dispositivo USB

Se desideri eseguire lo script su un dispositivo specifico, puoi utilizzare gli ID fornitore e prodotto

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

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

Con env , puoi vedere quale ambiente è impostato da udev e con file , scoprirai il tipo di file.

Gli attributi concreti per il tuo dispositivo possono essere scoperti con lsusb

lsusb

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


Non si tratta direttamente della tua domanda, ma di quello che stai facendo. Se avvii uno script di backup da udev, dovrai affrontare due problemi principali:

  1. Il tuo script potrebbe essere avviato prima che il dispositivo sia pronto e possa essere montato, devi mantenere la condizione KERNEL=="sd*" se vuoi usare il nodo /dev per montarlo
  2. Ancora più importante, se il tuo script impiega un po' di tempo per essere eseguito (cosa che può facilmente accadere con uno script di backup) verrà terminato poco dopo l'avvio (circa 5 secondi)
  3. Dovrai affrontare molti complicati problemi di autorizzazione utente

Il mio consiglio è di creare uno script nella tua home utente che ascolti una named pipe e che verrà avviato in modo asincrono come :

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

Nota:utilizzo il montaggio automatico con kde, quindi controllo la visualizzazione della cartella. Puoi passare il parametro /dev/sd* nel fifo dalla regola udev e montarlo tu stesso nello script. Per scrivere nel fifo non dimenticare che udev non è una shell e che il reindirizzamento non funziona. Il tuo RUN dovrebbe essere come :

RUN+="/bin/sh -c '/bin/echo connesso>> /tmp/IomegaUsbPipe'"


Ho pubblicato una soluzione su https://askubuntu.com/a/516336 e sto anche copiando e incollando la soluzione qui.

Ho scritto uno script Python usando pyudev che lascio in esecuzione in background. Quello script ascolta gli eventi udev (quindi, è molto efficiente) ed esegue il codice che voglio. Nel mio caso, esegue xinput comandi per configurare i miei dispositivi (collegamento alla versione più recente).

Ecco una versione breve dello stesso script:

#!/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. Come attivare un evento nello script della shell quando viene rimosso un dispositivo USB?

  2. Come riprodurre un suono quando l'esecuzione dello script è pronta?

  3. Come eseguire uno script quando i dispositivi USB vengono collegati o rimossi utilizzando UDEV

  4. Come eseguire un file senza estensione .sh nella shell

  5. Come eseguire uno script bash?

Come eseguire uno script nella shell quando viene premuto un tasto di scelta rapida?

Come eseguire Sh Script da un collegamento sul desktop?

Come eseguire un comando in uno script della shell?

Come eseguire uno script al termine della sessione xfce

Come eseguire lo script Python da Java?

Esegui script/programma quando il file cambia