Sie haben bereits die Antwort gefunden. Das Skript (zenity) benötigt einen X Window Server zum Anzeigen einer Nachricht. Das Skript wird ausgeführt udev
und hat keine Anzeige. Sie können dieses Problem lösen, indem Sie die DISPLAY
Variable in Ihrem Skript fest verdrahten, d. H
DISPLAY=:0; export DISPLAY
Der Nachteil dabei ist, dass es nur funktioniert, wenn Sie der einzige Benutzer sind und / oder die Anzeige im Voraus kennen. Wenn mehrere Benutzer auf dem System sind, könnte das Display etwas anderes sein, zum Beispiel :1
, :2
und so weiter. Oder ein anderer Benutzer erhält die Zenity-Nachricht auf seinem Bildschirm.
Ein besserer Ansatz wäre, die Erkennung des Ereignisses und die Interaktion mit dem Benutzer oder die Anzeige der Nachricht aufzuteilen.
Dazu können Sie ein Skript oder ein Programm erstellen, das in Ihrer GUI-Sitzung ausgeführt wird und auf einen Trigger eines Daemons oder des udev-Trigger-Skripts wartet.
Eine dritte Möglichkeit könnte darin bestehen, die zu verbinden udisks-daemon
und um Informationen zu bitten, wenn das externe Gerät angeschlossen ist. Sie können versuchen, udisks --monitor
oder udisks --monitor-detail
für diese und analysieren den Ausgang, wenn ein Ereignis eintritt.
Es scheint einen udisksctl
Befehl zu geben, der mit einer etwas anderen Syntax dasselbe tut. Vielleicht ist es nur eine neuere Version des udisks
Befehls.
Sie können sich auch einige Gui-Tools wie GNOME-Disks ansehen, die ebenfalls auf das udev / udisks-System angewiesen sind.
Update :
Die Mehrfachaufrufe ergeben sich normalerweise aus dem Bericht der verschiedenen Subsysteme. Sie können dies sehen, wenn Sie die Umgebung in einer Protokolldatei im /usr/local/bin/test.sh
Skript protokollieren
umask 077 mkdir -p /tmp/udevtest.d env >>/tmp/udevtest.d/udevtest.log
Beim Einstecken eines USB-Sticks erhalte ich die folgenden Berichte
$ grep -e ACTION -e SUBSYSTEM /tmp/udevtest.d/udevtest.log ACTION=add SUBSYSTEM=usb ACTION=add SUBSYSTEM=usb ACTION=add SUBSYSTEM=scsi ACTION=add SUBSYSTEM=scsi_host ACTION=add SUBSYSTEM=scsi ACTION=add SUBSYSTEM=scsi ACTION=add SUBSYSTEM=scsi_disk ACTION=add SUBSYSTEM=scsi_generic ACTION=add SUBSYSTEM=scsi_device ACTION=add SUBSYSTEM=bsg ACTION=add SUBSYSTEM=block ACTION=add SUBSYSTEM=block
Sie können auch hinzufügen, DEVTYPE
zwischen den beiden zu unterscheiden usb
oder disk
Berichte. Um die Berichte auf wenige oder sogar nur einen Anruf zu reduzieren, müssen Sie spezifischer sein und der udev-Regeldatei zusätzliche Bedingungen hinzufügen. Wählen SUBSYSTEM=scsi_disk
Sie z.