GNU/Linux >> Belajar Linux >  >> Linux

Cara menjalankan skrip shell saat saya menyambungkan perangkat USB

Jika Anda ingin menjalankan skrip pada perangkat tertentu, Anda dapat menggunakan id vendor dan produk

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

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

Dengan env , Anda dapat melihat lingkungan apa yang diatur dari udev dan dengan file , Anda akan menemukan jenis file.

Atribut konkret untuk perangkat Anda dapat ditemukan dengan lsusb

lsusb

memberi

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


Ini bukan tentang pertanyaan Anda secara langsung tetapi tentang apa yang Anda lakukan. Jika Anda memulai skrip cadangan dari udev, Anda akan menghadapi dua masalah utama :

  1. Skrip Anda mungkin dimulai sebelum perangkat siap dan dapat dipasang, Anda harus menjaga kondisi KERNEL=="sd*" jika Anda ingin menggunakan simpul /dev untuk memasangnya
  2. Yang lebih penting, jika skrip Anda membutuhkan waktu untuk dieksekusi (yang dapat dengan mudah terjadi pada skrip cadangan), skrip akan dimatikan segera setelah dimulai (sekitar 5 detik)
  3. Anda akan menghadapi banyak masalah izin pengguna yang rumit

Saran saya adalah membuat skrip di rumah pengguna Anda yang mendengarkan pipa bernama dan yang akan dimulai secara asinkron seperti :

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

Catatan:Saya menggunakan pemasangan otomatis dengan kde jadi saya memeriksa apakah folder tersebut muncul. Anda dapat meneruskan parameter /dev/sd* di fifo dari aturan udev dan memasangnya sendiri di skrip. Untuk menulis ke fifo, jangan lupa bahwa udev bukan shell dan pengalihan itu tidak berfungsi. LARI Anda harus seperti :

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


Saya telah memposting solusi di https://askubuntu.com/a/516336 dan saya juga menyalin-tempel solusinya di sini.

Saya menulis skrip Python menggunakan pyudev yang saya biarkan berjalan di latar belakang. Skrip itu mendengarkan acara udev (jadi, sangat efisien) dan menjalankan kode apa pun yang saya inginkan. Dalam kasus saya, ini menjalankan xinput perintah untuk menyiapkan perangkat saya (tautkan ke versi terbaru).

Berikut adalah versi singkat dari skrip yang sama:

#!/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. Cara Mengeksekusi Perintah/Script Secara Otomatis Selama Reboot atau Startup

  2. Bagaimana Cara Menjalankan Skrip Kustom Pada Plug-in Perangkat Usb?

  3. Bagaimana Cara Menjalankan Perintah Sebelum Login Pengguna Di Linux?

  1. Bagaimana Cara Menambahkan Baris Baru Ke Variabel Dalam Skrip Bash?

  2. Bagaimana Cara Mengatur Parameter Saat Pipa Bash Script Ke Bash?

  3. Bagaimana Cara Menjalankan Script Di Shell Saat Tombol Pintasan Ditekan?

  1. Bagaimana Memutar Suara Saat Eksekusi Skrip Sudah Siap?

  2. Bagaimana Cara Mengeksekusi Skrip Sh Dari Pintasan Desktop?

  3. Cara mengeksekusi skrip saat sesi xfce berakhir