Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ondro 17. 01. 2012, 11:04:20

Název: Skript reagující na vložení USB disku
Přispěvatel: ondro 17. 01. 2012, 11:04:20
mam program, ktory potrebujem spustit az ked sa v systeme objavi usb disk. Je to specialny disk, ktory sa objavi v systeme az po zhruba minute po jeho zapojeni do usb portu. Potrebujem disiahnut to aby skript kontroloval, ci uz sa v systeme dany disk objavil. Ak nie, vypisat hlasku "prosim cakajte..." a tak dookola kontrolovat kym sa dany disk v systeme neobjavi. Ak sa objavi spust program alebo iny prikaz.
Nemam skusenosti so skriptovanim a zatial mi vychadza pouzitie cyklu while alebo until ale neviem ako donho zapracovat aby napriklad kontroloval vystup z prikazu lsscsi (alebo inac kontroloval, ci sa v systeme objavil). Pokial je vystup prazdny, tak vypis text, ak sa nieco na vystupe objavilo spust program.
Staci ma nasmerovat, nemam problem si to nastudovat. Na internete som zatial nenasiel ako by bolo toto riesitelne. V prikladoch pri while su skoro vzdy uvadadze priklady, ktore riesia uplne ine veci. Zaujima ako do while zakomponovat lsscsi alebo iny prikaz, ktory mi zisti pritomnost usb kluca.

udev a ine veci neprichadzaju v uvahu. Vecsinou potrebujem aby sa ten skript spustil po prihlaseni uzivatela na konzolu.

nieco taketo:
Kód: [Vybrat]
#!/bin/sh

while ( lsscsi ) ; do
  echo "Prosim cakajte ...."
  sleep 2
done

echo "funguje to"
Název: Re:Skript reagující na vložení USB disku
Přispěvatel: Jozko 17. 01. 2012, 11:53:27
while :
do
    $(fdisk -l | grep '/dev/sdb' 1>/dev/null)  && { echo "USB najdeny" ; nejaky_prikaz; } || echo "Prosim cakajte ..."
    sleep 10
done
Název: Re:Skript reagující na vložení USB disku
Přispěvatel: Franta 17. 01. 2012, 12:03:30
$ udisks --monitor
Monitoring activity from the disks daemon. Press Ctrl+C to cancel.
added:     /org/freedesktop/UDisks/devices/sdb
removed:   /org/freedesktop/UDisks/devices/sdb


Vypisuje události, ve chvíli, kdy se stanou – tzn. nepotřebuješ nějakou smyčku a periodickou kontrolu.
Název: Re:Skript reagující na vložení USB disku
Přispěvatel: Zopper 17. 01. 2012, 12:06:20
Stálo by za to, podívat se na lsusb a parsovat výstup z něj - něco takového:
Kód: [Vybrat]
lsusb | cut -c24-32 | grep -c "0a5c:2110"kde "0a5c:2110" je ID vašeho usb klíče (zjistíte ho přes samotné lsusb). Tento příkaz vrátí "1", pokud takové zařízení je připojeno.
Pokud to vezmu jako Jozko, pak
Kód: [Vybrat]
#/bin/bash
while [ `lsusb | cut -c24-32 | grep -c "0a5c:2111"`  -eq 0 ];do
        echo "wait..."
        sleep 10; # cekej 10 sekund
done
echo "nalezeno"

Jozkův kód by se nikdy nedostal ze smyčky a vyžaduje, aby šel USB klíč připojit jako disk pokaždé na stejné písmenko, což v praxi nelze (jednoduše pro uživatele) 100% zaručit.

Můj příklad bude fungovat i kdybyste jako "usb klíč" použil třeba usb myš.

Nevím ale, jestli lsusb nějak nezávisí na udev.

Název: Re:Skript reagující na vložení USB disku
Přispěvatel: ondro 17. 01. 2012, 13:04:18
dakujem za reakcie. Naucil som sa zase nieoc noveho.
nevedel som ako ten test zapisat do while

to Jan Tulak :
to je to, co som potreboval. nevedel som ako postavit test a donho zakomponovat napr. lsscsi | grep  alebo  lsusb | grep .

Funguje to. Zaujimala by ma este jedna vec aku funkciu plni v danom skripte  cut -c24-32  lebo funguje to aj bez toho

Moj vypis lsusb obsahuje toto:
Kód: [Vybrat]
Bus 004 Device 001: ID 0000:0000 
Bus 001 Device 002: ID 03eb:2ffa Atmel Corp.
Bus 001 Device 001: ID 0000:0000 
Bus 003 Device 001: ID 0000:0000 
Bus 005 Device 001: ID 0000:0000 
Bus 002 Device 001: ID 0000:0000

v danom pouziti nebude nikdy ine zariadenie na usb zavesene, takze staci, co najjednoduchsia kontrola.

Este raz dakujme
Název: Re:Skript reagující na vložení USB disku
Přispěvatel: NotFound 17. 01. 2012, 13:26:33
cut -c24-32 ořeže řádek z grepu jen na 24. až 32. znak
Název: Re:Skript reagující na vložení USB disku
Přispěvatel: Dusan Zatkovsky 17. 01. 2012, 13:35:40
Ja to riesim cez udev.

cat /etc/udev/rules.d/99-backup-disk.rules
SUBSYSTEMS=="usb", KERNEL=="sd??", ACTION=="add", RUN+="/etc/msk-scripts/syncbackup2externaldisk"
Název: Re:Skript reagující na vložení USB disku
Přispěvatel: Jozko 18. 01. 2012, 11:11:11
Jo zabudol som tam nacpat break.

'cut -c24-32' vypise 24. az 32. znak (aj medzera je znak)

Priklad:
echo "Bus 001 Device 002: ID 03eb:2ffa" | cut -c24-32
- vypise: 03eb:2ffa
echo "Bus 001 Device 002: ID 03eb:2ffa" | cut -c5-7
- vypise 001
Název: Re:Skript reagující na vložení USB disku
Přispěvatel: Zopper 18. 01. 2012, 12:08:59
V tomto případě je cut celkem zbytečné (nehrozí, že by se ten řetězec objevil třeba v názvu zařízení), ale jsem zvyklý si osekávat porovnávané údaje jak to jde, abych se vyhnul případné chybě, kdy se mi tam zamíchá něco jiného...  :)
Jak už bylo řečeno, cut je tam proto, aby se porovnávaly pouze řetězce s ID, nikoliv už ten zbytek řádku.

PS: Udělal jsem jednoduchý test časové náročnosti variant s a bez cut, vícenásobné opakování přinášelo podobný rozdíl (rozdíl v celkovém čase kolísal tak nějak mezi 70-90ms)
Kód: [Vybrat]
$ time for i in {1..100}; do lsusb |grep "03eb:2ffa"; done
real 0m4.545s
user 0m4.109s
sys 0m0.410s

$ time for i in {1..100}; do lsusb | cut -c24-32|grep "03eb:2ffa"; done
real 0m4.611s
user 0m4.187s
sys 0m0.483s


Cut tedy představuje mírné zpomalení (necelou milisekundu) - sice asi o něco urychlí běh grepu, ale ne o tolik, aby se to vyplatilo.