Mám program C++, který přistupuje k USB flash diskům/flash diskům. Funguje pro aktuálně vložený flash disk. Normální program v C++ se nespustí, dokud jej nespustíme. Chtěl jsem ale, aby se program spouštěl automaticky při každém vložení flash disku. Jak to mohu udělat?
Přijatá odpověď:
Pro obecné použití, pokud chcete spustit svůj program pro jakékoli úložiště USB. Použijte ovladač pro shodu pravidla.
-
Přidejte
udev
soubor pravidelsudo nano /etc/udev/rules.d/90-detect-storage.rules
-
Přidejte toto pravidlo
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram"
Pokud chcete, aby váš program rozlišoval disky a spouštěl různé operace, použijte (můžete zadat jeho sériové číslo nebo jakýkoli atribut, který chcete):
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
-
Znovu načíst všechna pravidla
sudo udevadm control --reload-rules
-
Odpojte a znovu připojte flash disk
Poznámky:
-
Toto pravidlo jsem použil jen k testování, které vytvoří protokol, když je pravidlo spuštěno:
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/bin/sh -c 'echo $env{ID_VENDOR_ID} $env{ID_MODEL_ID} >> /home/username/Desktop/usb-storage.log'"
-
Pravidla, která nechcete, můžete komentovat přidáním
#
na začátek řádku. Soubor pravidel může obsahovat více pravidel. -
Chcete-li zkontrolovat všechna dostupná
env
proměnné, použijte:ACTION=="add", DRIVERS=="usb-storage", RUN+="/bin/sh -c 'echo == >> /home/username/Desktop/usb-storage-env.log; env >> /home/username/Desktop/usb-storage-env.log'"
-
Chcete-li zkontrolovat parametry pro shodu pravidla, spusťte:
sudo udevadm info --name=/dev/sdb1 --attribute-walk
Odkazy:
- Předejte ATTR{idVendor} jako argument ve skriptu udev
- Psaní pravidel udev od Daniela Drakea