2009-02-26 10 views
8

Ich weiß, dass Ubuntu (und Fedora) Upstart anstelle des klassischen System V init-Daemon (SysVinit) verwendet.Upstart-Skript (für eingestecktes USB-Laufwerk)

Ich würde gerne wissen, wie man erkennt, wenn ein USB-Laufwerk eingelegt wurde, mounten Sie es und kopieren Sie einige Dateien darauf. Ich möchte, dass Upstart dafür mein eigenes Skript nennt.

Wenn es möglich ist möchte ich Upstart das Skript für eine spezifische USB-Laufwerk aufrufen, so dass ich normale Funktionalität für jedes USB-Laufwerk außer meinem "Instant Backup" USB-Laufwerk bekommen würde.

Wenn Upstart die USB-Laufwerksidentifikationszeichenfolge als Argument an mein Skript senden könnte, wäre das die ideale Lösung, da ich die ID-Zeichenfolge in meinem Skript haben könnte und möglicherweise das Skript zwei verarbeiten könnte USB-Laufwerke ohne viel Veränderung.

Und als eine Randnotiz, kennen Sie ein anderes System außer Upstart, die USB-Laufwerke, Netzwerk-Dateisysteme und so auf eine nette Art behandelt? (Wie SysVinit seems not to.)

Antwort

8

upstart scheint nicht mit "USB-Gerät eingesteckt" Signale aus der Box kommen. Der Fokus war bisher so ziemlich genau wie init, und die "coolen angekündigten Features" sind in der Zukunft.

From the Fedora wiki: "... das Starten von Upstart selbst jetzt, obwohl es nur so funktioniert, wie SysV es jetzt tut, wird uns erlauben, einen reibungslosen Übergang zu diesem Modell zu beginnen."

Glücklicherweise können Sie die Zukunft selbst implementieren, indem Sie von udev ein Skript ausführen lassen, um Ihr benutzerdefiniertes Upstart-Signal zu senden, damit der Upstart Ihr Backup-Skript aufrufen kann. Sie könnten udev auch direkt Ihr Backup-Skript aufrufen lassen.

udev hat bereits eine einfache Möglichkeit, Skripts auszuführen, wenn Geräte angeschlossen und nicht angeschlossen sind. Siehe rename your usb hard drive's device name with udev rules. Auf meinem System müsste ich anstelle der udevmonitor --env des Tutorials verwenden. Nach dem Tutorial folgen, würden Sie eine andere udev-Regel wie diese erstellen:

echo 'SUBSYSTEM=="block", ID_SERIAL_SHORT=="101A9041C67D182E", \ 
NAME="myusbdrive", \ 
RUN+="/my/backup/script $env{NAME}"' > /etc/udev/rules.d/S96-mydrive.rules 

ID_SERIAL_SHORT Austausch mit dem tatsächlichen ID Ihres Geräts und $env{NAME} mit dem, was udev-Umgebungsvariable (n) Ihre Skript muss das Backup-Gerät finden. Möglicherweise müssen Sie das Skript im Hintergrund anzeigen, um das Blockieren von udev zu vermeiden.

Wenn Sie Upstart verwenden möchten, können Sie Ihre udev-Regel /sbin/initctl emit back-it-up VARIABLE=$env{VARIABLE} ... ausführen und dann ein Skript in /etc/event.d beginnend mit der Zeile start on back-it-up schreiben.

Siehe auch How can I listen for 'usb device inserted' events in Linux, in Python? für Hinweise auf das gleiche mit DBus. DBus ist möglicherweise bequemer, wenn Sie möchten, dass der angemeldete Benutzer einen Usermode-Dämon "Auf Backup-Laufwerk überwachen" ausführt.

+0

Vielen Dank für Ihre informative Antwort! Ich habe eine Frage.Warum sollte ich Upstart nicht dafür benutzen? (Sie haben keine Motivation gegeben.) –

+0

Upstart scheint nicht die "USB-Laufwerk eingesteckt" Nachrichten, so dass Sie entweder Ihre eigenen mit udev (oder dbus, oder ...) zu definieren, oder einfach nur udev haben Rufen Sie Ihr Backup-Skript direkt auf und sind Sie mit vielen anderen Linux-Systemen kompatibel. – joeforker

+0

Ich glaube, dass für Ihren Anwendungsfall DBus der Weg zu gehen wäre, da Sie wahrscheinlich wollen, dass der Backup-Service benutzerorientiert ist. Auch @joforker - gute Antwort! – Guss

4

In Ubuntu 9.10 und neuer Upstart verfügt über einige Udev-Funktionen über den upstart-udev-bridge-Dienst.

#thumbdrive_special.conf 
start on block-device-added 

task 

script 
    if [ `blkid $DEV` -eq "YOUR-THUMBDRIVES-UUID" ]; then 
     /home/you/bin/thumbdrive_special $DEV 
    fi 
end script 

Ich liebe, wie einfach und elegant Emporkömmling sein kann. Eine DBus-Lösung ist jedoch möglicherweise besser, wenn auch weniger elegant. Mit einer DBus-Lösung können Sie Benachrichtigungen an den Benutzer senden und eine einfache Benutzerkontrolle ermöglichen.