Nach USB anstecken script ausführen

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
mowses
Beiträge: 106
Registriert: 09.05.2003 15:33:01

Nach USB anstecken script ausführen

Beitrag von mowses » 11.09.2005 22:37:25

Hallo

Ich hatte zwar schon mal ein wenig die Suchfunktion bemüht, aber das richtige war da glaube ich nicht dabei.

Ich möchte eigentlich nur ein Script starten sobald ich meinen USB-Stick einstecke. Es soll nicht permanent geschaut worden ob ein Stick eingesteckt ist und dann das SCript ausgeführt werden. Wie gesagt, Stick rein, Script los.

Benutzeravatar
puntarenas
Beiträge: 712
Registriert: 28.05.2005 15:07:05

Beitrag von puntarenas » 11.09.2005 23:06:17

Geht mit hotplug und udev. Konkret heißt das, daß du eine udev-rule schreibst, die beim anstecken deines USB-Sticks ein Script ausführt.

Folgender Artikel enthält weiter unten ein auf CD-Roms bezogenes Beispiel:

http://www.linuxjournal.com/article/7316

Zum Schreiben von udev-rules dürfte dieser Link hilfreich sein:

http://www.reactivated.net/writing_udev_rules.html

HTH
puntarenas

mowses
Beiträge: 106
Registriert: 09.05.2003 15:33:01

Beitrag von mowses » 12.09.2005 21:35:38

Vielen Dank schon mal für deine Hilfe. Ich hab es nun gschafft, dass ich dem USB STick einen anderne Device Namen geben kann. Also immer den gleichen. In meinem Fall /dev/stick. Mit der folgenden udev-rule habe ich es versucht:

Code: Alles auswählen

BUS="scsi", SYSFS{vendor}="SigmaTel", NAME="stick", PROGRAM="copycurrent.pl"
Allerdings schlägt die Ausführung meines Programms fehl und dadurch wird dann auch /dev/stick nicht mehr angelegt. Das Problem liegt denke ich darin, dass ich in meinem Stick versuche einen Song auf den USB Stick zu kopiere:

Code: Alles auswählen

#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use File::Copy;

my $musicdir = "/usr/share/mpd/music/";
die("MPD.pm not found!\n") unless -f "/usr/local/bin/MPD.pm";
require("/usr/local/bin/MPD.pm");
my $mpd  = MPD->new();
my %currentsong = $mpd->get_current_song_info;
my $file = $musicdir.$currentsong{file};

#die("/dev/stick not present!\n") unless -f "/dev/stick";
system("mount", "/media/stick");
#system("cp", $absolutedir, "/media/stick/");
copy($file, "/media/stick") or die "Copy failed: $!";
system("umount", "/media/stick");
Die udev-rule schlägt denke ich fehl, weil das Programm ausgeführt wird, aber noch gar kein /dev/stick vorhanden ist. DA beisst sich die Katze aber in den SChwanz...

Wie erreiche ich es, dass das Programm erst ausgeführt wird, wenn /dev/stick beriets existiert? Würde es vielleicht etwas bringen wenn ich nicht das Script mounten lassen würde sondern das mounten bereits durch udev mache irgendwie?

Er braucht wohl den absoluten Pfad. Das bringt aber auch noch nicht wirklich viel.

Benutzeravatar
puntarenas
Beiträge: 712
Registriert: 28.05.2005 15:07:05

Beitrag von puntarenas » 12.09.2005 22:03:38

Sorry, vielleicht habe ich dich mit dem Beispiel im Link auf die falsche Fährte geschickt. Ich hatte selbst noch keinen Bedarf, ein eigenes Script auszuführen und dadurch kann das schonmal passieren.

Wenn die Umgebungsvariable UDEV_NO_DEVD nicht gesetzt ist, werden standardmäßig nach dem Anlegen der Gerätedateien Programme im Verzeichnis /etc/dev.d/ ausgeführt.

Näheres gibt es hier:

http://kernel.org/pub/linux/utils/kerne ... /RFC-dev.d

Gruß
puntarenas

mowses
Beiträge: 106
Registriert: 09.05.2003 15:33:01

Beitrag von mowses » 12.09.2005 22:18:42

Vielen Dank!! :-) :D

Das war das letzte kleine bisschen welches mir auf meinem langen Weg noch gefehlt hatte.

Unter /etc/dev.d hatte ich mein device eingefügt. Aufgrund von /dev/stick lautet dies /etc/dev.d/stick. Darin konnte ich dann einen symlink zu meinem copryscript anlegen. Ich hätte natürlich auch direkt mein Script reinlegen können. Aber es funktioniert nun!!

Meine Fresse! Aber Ende gut alles gut! :-)

mowses
Beiträge: 106
Registriert: 09.05.2003 15:33:01

Beitrag von mowses » 14.09.2005 11:31:26

Eine Frage hab ich nun doch noch. Das Script wird anscheinend auch ausgeführt wenn ich den Stick wieder entferne. Kann ich das irgendwie verhindern? In dem von dir verlinkten Artikel steht da denke ich nichts wie man das verhindern kann... Mhm.

Benutzeravatar
puntarenas
Beiträge: 712
Registriert: 28.05.2005 15:07:05

Beitrag von puntarenas » 14.09.2005 13:06:53

Aus "man hotplug":
Information about an event is passed in the form of environment vari‐
ables. Most agents accept a "ACTION" variable that describes the type
of the event. It is set to "add" or "remove" to signify that some
device has just been connected to or disconnected from the system.
Von Perl habe ich leider keine Ahnung, aber in einem Bashscript würde das dann etwa so aussehen

Code: Alles auswählen

if [ $ACTION = "add" ]

Code: Alles auswählen

if [ $ACTION = "remove" ]
Sag Bescheid, wenn es geklappt hat. Die Erfahrungen, die du hier mühevoll sammelst, werden mir sicherlich einmal nützlich sein :)

Gruß
puntarenas

Benutzeravatar
ZOiD
Beiträge: 219
Registriert: 13.07.2003 15:20:04
Lizenz eigener Beiträge: GNU General Public License

Beitrag von ZOiD » 17.03.2006 14:34:02

Moin,

dazu hätte ich noch ne Frage.
Ich habe mir das per udev auch so anelegt, dass ein bestimmter USB Stick nach /dev/stick gemappt wird. Dazu habe ich ein Script :

Code: Alles auswählen

#!/bin/sh
if [ $ACTION = "add" ];
  then
      # usb-stick einhängen
  mount /dev/stick /mnt/stick
fi;
damit der Stick auch gleich gemountet wird, als /etc/dev.d/stick/stick.dev abgelegt.
Allerdings funktioniert das nicht, ich weiss aber nicht woran das liegt, also ob das script nicht ausgeführt wird oder an was anderem.
Jemand nen Rat?

Danke
ZOiD

mowses
Beiträge: 106
Registriert: 09.05.2003 15:33:01

Beitrag von mowses » 17.03.2006 16:44:46

@puntarenas
Das ganze hat übrignes wunderbar geklappt und leistet mir schon längere Zeit treue Dienste.

@ZOid
Ich habe mein Script damals mit Tönen fehlerfrei bekommen. Also immer wenn etwas entscheidendes kam hab ich mit mpg321 eine Melodie oder dergleichen abspielen lassen. Somit konnte ich dann sehen woran es hakt. Geht sicher auch anders, aber so klappte es bei mir.

Bei dir könntest du es folgendermaßen probieren:

Code: Alles auswählen

#!/bin/sh
if [ $ACTION = "add" ];
mpg321 soundfile.wav
  then
      # usb-stick einhängen
  mount /dev/stick /mnt/stick
fi;
Allerdings garantiere ich nicht für die Richtigkeit der codeschnipsel. Meine Fertigkeiten im Bashscripten sind nämlich mehr als mies.

Benutzeravatar
ZOiD
Beiträge: 219
Registriert: 13.07.2003 15:20:04
Lizenz eigener Beiträge: GNU General Public License

Beitrag von ZOiD » 17.03.2006 18:55:05

Moin,

Danke für die Antwort.
Ich habe das Script in /etc/dev.d/default/ verschoben, so geht´s.
Das steht aber anders in der man-page

Gruß
ZOiD

mowses
Beiträge: 106
Registriert: 09.05.2003 15:33:01

Beitrag von mowses » 17.03.2006 18:58:25

Bei mir klappt es auch, wenn das Script in /etc/dev.d/stick liegt. Dort ist copy.dev dann allerdings ein Symlink auf mein Perlscript.

Antworten