Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[udev] Script bei disconnect eines USB-Devices aufrufen

2 views
Skip to first unread message

Marc Haber

unread,
Nov 11, 2009, 1:00:18 PM11/11/09
to
Hallo,

ich habe hier einen 8fach-USB-to-Serial-Adapter und möchte gerne ein
Script aufrufen, sobald dieser Adapter eingesteckt oder entfernt wird.
Das ganze findet auf einem modifizierten Debian Stable statt (i386,
kernel 2.6.31.5, udev 0.125).

Dazu habe ich acht udev-Regeln, von denen ich hier eine paste:

|SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="usb", \
| KERNELS=="1-*.2.3", RUN+="/usr/local/sbin/udev-serial-event", \
| SYMLINK="USBserial03"

Der Stern kommt daher, dass das funktionieren soll, unabhängig davon,
in welchen der beiden USB-Ports des Hostsystems der Adapter
eingesteckt wird.

Beim Einstecken des Adapters bekomme ich diese Ausgabe von udevadm
monitor (gefiltert auf die Events, die \.2\.3 enthalten):
|UEVENT[1257961108.458192] add /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3 (usb)
|UDEV [1257961108.458924] add /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3 (usb)
|UEVENT[1257961108.460789] add /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3/1-2.2.3:1.0 (usb)
|UEVENT[1257961108.472880] add /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3/1-2.2.3:1.0/ttyUSB2 (usb-serial)
|UEVENT[1257961108.472896] add /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3/1-2.2.3:1.0/ttyUSB2/tty/ttyUSB2 (tty)
|UDEV [1257961108.509515] add /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3/1-2.2.3:1.0 (usb)
|UDEV [1257961108.510221] add /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3/1-2.2.3:1.0/ttyUSB2 (usb-serial)
|UDEV [1257961108.525396] add /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3/1-2.2.3:1.0/ttyUSB2/tty/ttyUSB2 (tty)

Mein Script wird gerufen, der Symlink wird angelegt, alles ist gut.

Beim Abziehen des Adapters entstehen diese Events:
|UEVENT[1257961123.282083] remove /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3/1-2.2.3:1.0/ttyUSB2/tty/ttyUSB2 (tty)
|UEVENT[1257961123.282117] remove /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3/1-2.2.3:1.0/ttyUSB2 (usb-serial)
|UEVENT[1257961123.282134] remove /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3/1-2.2.3:1.0 (usb)
|UEVENT[1257961123.282150] remove /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3 (usb)
|UDEV [1257961123.316759] remove /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3/1-2.2.3:1.0/ttyUSB2/tty/ttyUSB2 (tty)
|UDEV [1257961123.325555] remove /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3/1-2.2.3:1.0/ttyUSB2 (usb-serial)
|UDEV [1257961123.338084] remove /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3/1-2.2.3:1.0 (usb)
|UDEV [1257961123.343668] remove /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2.2/1-2.2.3 (usb)

Der symlink wird gelöscht, aber mein Script nicht gerufen.

Wenn ich udevadm control --log_priority=debug aufrufe, sehe ich beim
Einstecken des Adapters auch, dass mein Script gerufen wird
(run_program-Einträge im syslog), beim Abziehen des Adapters findet
das nicht statt.

Hat jemand eine Idee, woran das liegt und was ich noch tun könnte, um
das so hinzubekommen wie ich es gerne hätte?

Grüße
Marc

--
-------------------------------------- !! No courtesy copies, please !! -----
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " | http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834

Manfred Schmitt

unread,
Nov 11, 2009, 3:41:44 PM11/11/09
to
Marc Haber schrieb:

>
> ich habe hier einen 8fach-USB-to-Serial-Adapter und möchte gerne ein
> Script aufrufen, sobald dieser Adapter eingesteckt oder entfernt wird.
> Das ganze findet auf einem modifizierten Debian Stable statt (i386,
> kernel 2.6.31.5, udev 0.125).
>
> Dazu habe ich acht udev-Regeln, von denen ich hier eine paste:
>
> |SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="usb", \
> | KERNELS=="1-*.2.3", RUN+="/usr/local/sbin/udev-serial-event", \
> | SYMLINK="USBserial03"
>
Brauchst Du nicht je zwei Regeln, eine fuer ACTION=="add" und eine fuer
ACTION=="remove"?
Siehe auch
http://dventurin.blogspot.com/2007/04/udev-action-add-remove.html
oder auch im gentoo-wiki:
http://en.gentoo-wiki.com/wiki/Autofs#UDEV_with_Autofs

Und wech,
Manne

Marc Haber

unread,
Nov 11, 2009, 4:21:58 PM11/11/09
to
Manfred Schmitt <expires...@slashproc.org> wrote:
>Marc Haber schrieb:
>> ich habe hier einen 8fach-USB-to-Serial-Adapter und möchte gerne ein
>> Script aufrufen, sobald dieser Adapter eingesteckt oder entfernt wird.
>> Das ganze findet auf einem modifizierten Debian Stable statt (i386,
>> kernel 2.6.31.5, udev 0.125).
>>
>> Dazu habe ich acht udev-Regeln, von denen ich hier eine paste:
>>
>> |SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="usb", \
>> | KERNELS=="1-*.2.3", RUN+="/usr/local/sbin/udev-serial-event", \
>> | SYMLINK="USBserial03"
>>
>Brauchst Du nicht je zwei Regeln, eine fuer ACTION=="add" und eine fuer
>ACTION=="remove"?

Ist ACTION nicht ein simpler Match, und wenn er nicht da ist, greift
die Regel für add _und_ remove?

Manfred Schmitt

unread,
Nov 11, 2009, 7:42:10 PM11/11/09
to
Marc Haber schrieb:

> Manfred Schmitt <expires...@slashproc.org> wrote:
> >Marc Haber schrieb:
> >> ich habe hier einen 8fach-USB-to-Serial-Adapter und möchte gerne ein
> >> Script aufrufen, sobald dieser Adapter eingesteckt oder entfernt wird.
> >>

> >> Dazu habe ich acht udev-Regeln, von denen ich hier eine paste:
> >>
> >> |SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="usb", \
> >> | KERNELS=="1-*.2.3", RUN+="/usr/local/sbin/udev-serial-event", \
> >> | SYMLINK="USBserial03"
> >>
> >Brauchst Du nicht je zwei Regeln, eine fuer ACTION=="add" und eine fuer
> >ACTION=="remove"?
>
> Ist ACTION nicht ein simpler Match, und wenn er nicht da ist, greift
> die Regel für add _und_ remove?
>

Anscheinend nicht? :-)
Ich nutze add/remove in etwa so wie im gentoo-wiki fuer usb-storage und das
funktioniert relativ problemfrei (manchmal bleiben autofs-mount-Definitionen
erhalten obwohl es das device nicht mehr gibt).

Und wech,
Manne

Marc Haber

unread,
Nov 12, 2009, 3:52:36 AM11/12/09
to

Du würdest also zwei Regeln schreiben:
|ACTION=="add", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="usb", \


| KERNELS=="1-*.2.3", RUN+="/usr/local/sbin/udev-serial-event", \
| SYMLINK="USBserial03"

|ACTION=="remove", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="usb", \


| KERNELS=="1-*.2.3", RUN+="/usr/local/sbin/udev-serial-event"

Grüße

Manfred Schmitt

unread,
Nov 12, 2009, 6:55:52 AM11/12/09
to
Marc Haber schrieb:

> Manfred Schmitt <expires...@slashproc.org> wrote:
> >Marc Haber schrieb:
> >>

> >> Ist ACTION nicht ein simpler Match, und wenn er nicht da ist, greift
> >> die Regel für add _und_ remove?
> >>
> >Anscheinend nicht? :-)
> >Ich nutze add/remove in etwa so wie im gentoo-wiki fuer usb-storage und das
> >funktioniert relativ problemfrei (manchmal bleiben autofs-mount-Definitionen
> >erhalten obwohl es das device nicht mehr gibt).
>
> Du würdest also zwei Regeln schreiben:
> |ACTION=="add", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="usb", \
> | KERNELS=="1-*.2.3", RUN+="/usr/local/sbin/udev-serial-event", \
> | SYMLINK="USBserial03"
>
> |ACTION=="remove", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="usb", \
> | KERNELS=="1-*.2.3", RUN+="/usr/local/sbin/udev-serial-event"
>

Hm, hab nochmal nachgeschaut, bei mir habe ich das fuer autofs doch in
einer Regel: SUBSYSTEMS=="usb", KERNEL=="sd?[1-9]", MODE="0664", \
RUN+="/lib/udev/autofs-create", ENV{REMOVE_CMD}="/lib/udev/autofs-remove"

Nebenbei, auch wenn das nicht relevant sein sollte: Was macht das Skript
eigentlich?
Ich frage mich ja schon seit laengerem ob man autofs z.B. mit einer GEMBIRD
SiS-PM kombiniert kriegt ( --ghost geht dann wohl nicht, naja):
http://sispmctl.sourceforge.net/

Und wech,
Manne

Marc Haber

unread,
Nov 12, 2009, 7:40:40 AM11/12/09
to
Manfred Schmitt <expires...@slashproc.org> wrote:
>Nebenbei, auch wenn das nicht relevant sein sollte: Was macht das Skript
>eigentlich?

Startet die zu den seriellen Schnittstellen passenden cereal-Sessions
und stoppt sie beim Verschwinden der seriellen Schnittstellen.

Sieghard Schicktanz

unread,
Nov 12, 2009, 3:19:43 PM11/12/09
to
Hallo Marc,

Du schriebst am Wed, 11 Nov 2009 19:00:18 +0100:

> |SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="usb", \
> | KERNELS=="1-*.2.3", RUN+="/usr/local/sbin/udev-serial-event", \
> | SYMLINK="USBserial03"

Kᅵnnte das ggfs. daher kommen, daᅵ beim "remove" der Symlink einen Fehler
bringt (der zu verlinkende Eintrag ist ja grade entschwunden) und dzf.
weiteres der Regel nicht mehr ausgefᅵhrt wird?
Wenn das der Fall ist, dann brauchtest Du _zwei_ Regeln, eine fᅵr
'ACTION=="add"' und eine zweite, ohne den 'SYMLINK=..."-Teil, fᅵr
'ACTION=="remove"'.

So hab' ich das in einem Fall bei mir gemacht, und da lᅵuft das.
(Ich habe allerdings andere Kriterien gebraucht, und die sind auch fᅵr
"add" und "remove" etwas unterschiedlich - vielleicht ist Deine Regel auch
da etwas zu pauschal;)

--
(Weitergabe von Adressdaten, Telefonnummern u.ᅵ. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ᅵhnlichem)
-----------------------------------------------------------
Mit freundlichen Grᅵᅵen, S. Schicktanz
-----------------------------------------------------------

Marc Haber

unread,
Nov 13, 2009, 8:21:32 AM11/13/09
to
Marc Haber <mh+usene...@zugschl.us> wrote:
>ich habe hier einen 8fach-USB-to-Serial-Adapter und möchte gerne ein
>Script aufrufen, sobald dieser Adapter eingesteckt oder entfernt wird.
>Das ganze findet auf einem modifizierten Debian Stable statt (i386,
>kernel 2.6.31.5, udev 0.125).
>
>Dazu habe ich acht udev-Regeln, von denen ich hier eine paste:
>
>|SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="usb", \
>| KERNELS=="1-*.2.3", RUN+="/usr/local/sbin/udev-serial-event", \
>| SYMLINK="USBserial03"
>
>Der Stern kommt daher, dass das funktionieren soll, unabhängig davon,
>in welchen der beiden USB-Ports des Hostsystems der Adapter
>eingesteckt wird.

Ich habe inzwischen mit berufenem Munde gesprochen (vielen Dank, Marco
d'Itri, I really appreciate that). Zu dem Zeitpunkt, zu dem die
remove-events bearbeitet werden, gibt es die sysfs-Attribute nicht
mehr, und deswegen matchen die Regeln nimmer. Es gibt aber die
Möglichkeit, mit der Add-Regel schon ein Kommando zu hinterlegen, das
beim Disconnect ausgeführt wird: ENV{REMOVE_CMD}. Außerdem greife ich
mir wohl die Wert zu chaotisch aus verschiedenen sysvs-Levels zusammen
(das funktioniert in Debian stable bei udev 0.125 noch, in den neueren
udev-Versionen in Debian testing/unstable aber nicht mehr), so dass
die vereinfachte Regel so aussieht:

|KERNEL=="ttyUSB*", KERNELS=="1-*.2.1", \
| RUN+="/usr/local/sbin/udev-serial-event", \
| ENV{REMOVE_CMD}+="/usr/local/sbin/udev-serial-event", \
| SYMLINK+="USBserial01"

Leider ist ENV{REMOVE_CMD} in udev 0.125 defekt, so dass das in Debian
stable auch nicht funktioniert.

Vladimir Dovgal

unread,
Nov 16, 2009, 2:17:26 PM11/16/09
to
On 13 Nov., 14:21, Marc Haber <mh+usenetspam0...@zugschl.us> wrote:

Vladimir Dovgal

Marc Haber

unread,
Nov 18, 2009, 10:39:12 AM11/18/09
to
Ingrid Haber <mh+usene...@zugschl.us> wrote:
>|KERNEL=="ttyUSB*", KERNELS=="1-*.2.1", \
>| RUN+="/usr/local/sbin/udev-serial-event", \
>| ENV{REMOVE_CMD}+="/usr/local/sbin/udev-serial-event", \
>| SYMLINK+="USBserial01"
>
>Leider ist ENV{REMOVE_CMD} in udev 0.125 defekt, so dass das in Debian
>stable auch nicht funktioniert.

|KERNEL=="ttyUSB*", KERNELS=="1-*.2.1", \
| RUN+="/usr/local/sbin/udev-serial-event", \

| ENV{REMOVE_CMD}="/usr/local/sbin/udev-serial-event", \
| SYMLINK+="USBserial01"

tut es nun auch mit Debian stable mit altem und neuem Kernel, man
beachte das nun fehlende + in der ENV{REMOVE_CMD} Zeile. Vielen Dank
an Manfred Schmitt, der mir in einem anderen Medium eine bei ihm
funktioniernende udev-Regel mit ENV{REMOVE_CMD} nannte, anhand derer
ich den Fehler in meinen Regeln lokalisieren konnte.

0 new messages