Homepage
 

Hallo, Gast.
Suchen
Hint einsenden
Hint einsenden
Website Quick Links
 
Aktuelle OS X Hints
 
Neue Forumsbeiträge
 
Zurück  10.4: Einführung zu launchd unter Mac OS X
UNIX
In diesem Hint möchte ich ein paar Tipps, Erfahrungen und Beispiele zur Funktion von launchd beschreiben. Ich muss mich auf Anwendungen beschränken, die der Konfiguration des eigenen Computers dienen. Selbstverständlich werden die Möglichkeiten von launchd damit nicht ausgeschöpft. Launchd bietet für Netzwerk-Administratoren und Programmierer noch sehr viel mehr Möglichkeiten. Vielleicht findet sich ja jemand, der eine Fortsetzung schreibt... Natürlich ist vieles übersetzt und angeeignet; die Quellenangaben finden Sie am Schluss.


1. Was ist launchd
2. Dämonen und Agents
3. Bauklötze für die plist
4. plists laden und testen
5. Bastelanleitungen (Startobjekt / Papierkorb auf dem Schreibtisch
6. Quellenangaben



1. Was ist launchd?

Launchd ist seit Mac OS 10.4 der neue Hintergrundprozess des Systems, der zuständig ist für die Steuerung der übrigen Hintergrundprozesse und anderer Programme. Launchd übernimmt als zentraler Superdämon zahlreiche Aufgaben, die früher auf mehrere Programme verteilt waren (init, rc, inetd, cron, SystemStarter und andere). Die bisherigen Programme funktionieren nach wie vor, die Zukunft gehört aber voraussichtlich launchd.

Launchd ist noch nicht aus den Kinderkrankheiten heraus. Der OnDemand-Schlüssel ist unlogisch, die Schlüssel StartInterval und StartCalendarInterval haben bis 10.4.2 nicht funktioniert, der Ladevorgang ist fehleranfällig und die Fehlermeldungen sind nicht immer sehr hilfreich. Wenn Sie also ein möglichst stabiles System brauchen und weder Zeit noch Lust haben, neue Verfahren auszuprobieren, bleiben Sie bis auf Weiteres besser bei den bewährten Methoden.

Launchd hat aber auch einige viel versprechende Vorteile. Einerseits ist die neue Systemstruktur ein Grund für den schnelleren Startvorgang unter 10.4. Launchd überprüft während des Startvorgangs zwar alle Hintergrundprozesse, startet aber nur jene, die wirklich benötigt werden. Andererseits ist das System benutzerfreundlicher geworden und bietet auch mehr Möglichkeiten. Dank launchd können Sie relativ einfach Ihre eigenen Hintergrundprozesse erstellen. Sie können Ihren Computer oder Ihr Netzwerk so einrichten, dass ein ausgewählter Prozess immer dann ausgeführt wird, wenn ein bestimmtes Ereignis eintritt. Als auslösendes Ereignis können Sie Verschiedenes definieren: den Startvorgang, einen bestimmten Zeitpunkt, den Zugriff auf einen Port, die Änderung eines Dokuments oder Ordners usw. Der Superdämon launchd knüpft gewissermassen die Knoten, in dem bestimmte Ereignisse mit den auszuführenden Programmen verbunden werden. Und ganz nebenbei knüpft er noch ein paar weitere Fäden an: Benutzer, Limiten, Prioritäten usw. Als Administrator oder Benutzer müssen Sie nur noch angeben, wo die äusseren Enden der Fäden festgemacht sind. Anders gesagt, Sie müssen in einer plist festlegen, welches Ereignis welchen Prozess mit welchen Limiten usw. starten soll.



2. Dämonen und Agents

Der Begriff Dämon dient oft als Überbegriff für sämtliche Hintergrundprozesse. Im engeren Sinn kann man unterscheiden zwischen einem Dämon und einem Agent. Ein Dämon ist ein Hintergrundprozess, der als root ausgeführt wird. Er läuft ganz unabhängig davon, ob ein oder mehrere Benutzer angemeldet sind, und ist auch von sich aus nicht in der Lage, Verbindung zu benutzerspezifischen Objekten aufzunehmen. Ein Agent ist ein Hintergrundprozess, der von einem oder mehreren Benutzern ausgeführt wird und mit benutzerspezifischen Objekten in Verbindung treten kann.

In Mac OS 10.4. stehen Ihnen drei Verzeichnisse zur Verfügung, in denen Sie sinnvollerweise Ihre plists ablegen können. Falls die folgenden Ordner bei Ihnen nicht existieren, können Sie sie selber anlegen.
  • /Library/LaunchDaemons
    In diesen Ordner legen Sie Ihre plist, wenn Sie einen benutzerunabhängigen Daemon erstellen möchten.
  • /Library/LaunchAgents
    In diesen Ordner legen Sie Ihre plist, wenn Sie einen Agent erstellen möchten, der für alle angemeldeten Benutzer aktiv ist.
  • ~/Library/LaunchAgents
    In diesen Ordner legen Sie Ihre plist, wenn Sie einen Agent erstellen möchten, der nur für einen bestimmten Benutzer aktiv ist.
Sie finden ausserdem eine ganze Reihe von launchd.plists im Ordner /System/Library/LaunchDaemons. Apple empfiehlt diesen Ordner nur für die systemeigenen plists zu verwenden. Aber wenn Sie sich ein paar Beispiele ansehen möchten, sollten Sie unbedingt einen Blick da hinein werfen.



3. Bauklötze für die plist

Als Baumaterial für die plists stehen Ihnen eine Reihe von "Schlüsseln" (engl. keys) zur Verfügung, mit denen Sie den Hintergrundprozess Ihren Bedürfnissen anpassen können. Die beiden Schlüssel "Label" und "ProgramArguments" müssen in jeder launchd.plist gesetzt werden. Alle übrigen sind fakultativ. Für jeden Schlüssel müssen Sie die Art (engl. class) und meistens einen Wert (engl. value) festlegen. Im Folgenden finden Sie eine Aufstellung der wichtigsten Schlüssel (und in Klammern die dazugehörige Art, wie sie im Property List Editor erscheint). Die vollständige Liste finden Sie unter man launchd.plist.

Label (string)
Hier müssen Sie den Namen des Dämons oder Agents eintragen. Im Grunde ist es egal, welchen Namen Sie wählen. Apple empfiehlt allerdings umgekehrte Domainnamen, die mit der entsprechenden plist korrespondieren – also zum Beispiel com.apple.periodic-daily für den Dämon und com.apple.periodic-daily.plist für die entsprechende plist.

ProgramArguments (array of strings)
Hier müssen Sie eingeben, welches Programm ausgeführt werden soll. Sie können den absoluten Pfad zu einem Skript oder Programm in einer einzigen Zeile eingeben. Sie können auch mehrere Zeilen verwenden, wobei jede Zeile ein einziges Programm-Argument enthalten muss.

Disabled (boolean)
Mit diesem Schlüssel können Sie die plist deaktivieren, ohne dass Sie sie aus dem Ordner entfernen müssen. Die Standardeinstellung ist "No". Wenn Sie einen Dämon oder Agent in der plist mit dem Disabled-Schlüssel deaktivieren, wird er beim nächsten Systemstart nicht geladen.

OnDemand (boolean)
Dieser Schlüssel dient dazu, ein bestimmtes Programm am Laufen zu halten. Die Bezeichnung "OnDemand" ist meiner Meinung nach verwirrend, vor allem weil die Standardeinstellung "Yes" ist. Wird der Schlüssel nicht gesetzt (oder ist sein Wert "Yes"), so wird der betreffende Prozess nur ausgeführt, wenn er benötigt wird. Sie brauchen ihn also nicht zu setzen, damit der Prozess auf Verlangen ausgeführt wird. Ist der Wert des Schlüssels "No", so wird der entsprechende Prozess immer wieder neu gestartet, sobald er beendet wird. Dies ist sinnvoll, wenn Sie verhindern möchten, dass ein bestimmtes Programm beendet wird.

RunAtLoad (boolean)
Wird dieser Schlüssel gesetzt, so wird das angegebene Programm ausgeführt, sobald der Dämon oder Agent geladen wird. Der Dämon oder Agent wird auch ohne diesen Schlüssel geladen (es sei denn Sie haben ihn deaktiviert).

WatchPaths (array of strings)
Hier können Sie einen oder mehrere absolute Pfade zu ausgewählten Objekten eingeben. Damit wird eine Bedingung für die Ausführung des angegebenen Programms formuliert: es wird immer dann gestartet, wenn einer dieser Pfade verändert wird.

QueueDirectories (array of strings)
Dieser Schlüssel funktioniert ähnlich wie WatchPaths. Sie können hier aber keine Dokumente oder beliebigen Verzeichnisse angeben, sondern nur leere Ordner. Das angegebene Programm wird gestartet, sobald ein Objekt in einen dieser Ordner gelegt wird. Das Programm sollte den betreffenden Ordner wieder leeren.

StartInterval (number)
Mit diesem Schlüssel können Sie einen Prozess in regelmässigen Abständen immer wieder neu starten. Wenn Sie eine Zahl n eingeben, wird der Prozess jeweils im Abstand von n Sekunden neu gestartet. Der Schlüssel wird ignoriert, wenn sich der Computer im Ruhezustand befindet.

StartCalendarInterval (dictionary)
Mit diesem Schlüssel können Sie einen Prozess immer zu einem bestimmten Zeitpunkt starten. Um den Zeitpunkt zu definieren können Sie je nach Bedarf den Monat, den Wochentag, den Tag im Monat, die Stunde oder die Minute bestimmen. Dazu dienen die folgenden Begriffe:
  • Minute (number)
  • Hour (number)
  • Day (number)
  • Weekday (number) (0 und 7 stehen für Sonntag.)
  • Month (number)
Befindet sich der Computer zum angegebenen Zeitpunkt im Ruhezustand, wird der Prozess gestartet, sobald er aus dem Ruhezustand erwacht.

Hinweis: Die beiden Schlüssel StartInterval und StartCalendarInterval funktionieren erst seit 10.4.3 zuverlässig.



4. plists laden und testen

Damit eine neu erstellte plist von launchd registriert wird, muss sie zunächst einmal geladen werden. Sie könnten sich dazu ab und wieder anmelden oder einen Neustart machen. Die beste Möglichkeit bietet aber der Befehl launchctl. Wenn Sie die plist irgendwas.plist im Ordner ~/Library/LaunchAgents laden möchten, geben Sie den folgenden Befehl ins Terminal ein:

launchctl load ~/Library/LaunchAgents/irgendwas.plist

Und um die plist zu deaktivieren tippen Sie:

launchctl unload ~/Library/LaunchAgents/irgendwas.plist

Mit dem letzten Befehl haben Sie zwar die plist für den Moment deaktiviert, aber beim nächsten Startup oder Login wird Sie wieder geladen. Wenn Sie sie ganz ausschalten wollen (in anderen Worten: wenn Sie den Schlüssel "Disabled" setzen wollen), so benötigen Sie den folgenden Befehl:

launchctl unload -w ~/Library/LaunchAgents/irgendwas.plist

Und um den Schlüssel "Disabled" wieder zu entfernen:

launchctl load -w ~/Library/LaunchAgents/irgendwas.plist

Wenn Sie sehen wollen, welche plists geladen sind, tippen Sie:

launchctl list

Wenn Sie den Computer ausschalten, werden sämtliche Prozesse beendet und deaktiviert; beim nächsten Start und Login werden alle Dämonen und Agents neu geladen, die nicht mit dem Disabled-Schlüssel deaktiviert sind. Wenn Sie sich abmelden, werden Ihre laufenden Agents nicht deaktiviert; beim anschliessenden Login werden nur die nicht geladenen Agents neu geladen.

Das Laden und Testen eines Dämons oder Agents ist nicht ganz unproblematisch. Die Testresultate lassen manchmal nur schwer auf die zugrunde liegenden Fehler schliessen. (Dämonen sind manchmal rätselhaft.)

Es kann vorkommen, dass ein Skript zwar funktioniert, wenn Sie es aus dem Terminal starten, aber dass es sich von der plist aus nicht starten lässt. In diesen Fällen liegt das Problem meistens daran, dass das Skript Dinge vorschreibt, die ein Dämon nicht darf. Launchd stellt da höhere Ansprüche als das Terminal. (Dämonen sind manchmal anspruchsvoll.)
Es kann auch passieren, dass eine Agent oder Dämon funktioniert, wenn er über das Terminal oder Lingon geladen wird, aber dass er nach einem Neustart nicht mehr funktioniert. In diesem Fall liegt das Problem vermutlich daran, dass das Skript Dinge vorschreibt, die zu diesem Zeitpunkt des Startvorgangs noch nicht möglich sind. (Dämonen sind Frühaufsteher.)
Wenn Sie eine plist mit einem negierten OnDemand-Schlüssel laden, braucht launchd ein wenig Zeit, um den Prozess in Gang zu halten. Warten Sie mindestens zehn Sekunden, bevor Sie den Dämon überprüfen, sonst stürzt er ab und der Test ist unbrauchbar. Und wenn ein Dämon mehrmals abstürzt, sträubt er sich und lässt sich irgendwann gar nicht mehr laden. (Dämonen sind manchmal nachtragend.)

Oder – noch verwirrender – es kann passieren, dass eine plist geladen wird und funktioniert und dann nach etwa zwei Minuten plötzlich nicht mehr funktioniert. In diesem Fall stürzt vermutlich der Dämon aus irgendeinem Grund ab und wird zugleich durch einen negierten OnDemand-Schlüssel in Gang gehalten. Nach zehn Sekunden wird er erneut gestartet und nach zehn vergeblichen Versuchen deaktiviert. (Dämonen sind manchmal launisch.)

Ganz allgemein gilt, dass Sie die plist testen müssen, indem Sie sie mit einem einwandfreien Skript verknüpfen, das nicht nur vom Terminal, sondern auch von launchd akzeptiert wird. Wenn ein erfolgreiches Skript und eine erfolgreiche plist sich nicht zu einem funktionierenden Dämon verknüpfen lassen, liegt das Problem wohl meistens beim Skript. Die Fehlermeldungen in der Konsole können da weiter helfen.



5. Bastelanleitungen

Um eine launchd.plist zu erstellen oder zu bearbeiten, bieten sich zwei Möglichkeiten an: der Property List Editor und Lingon. Der Property List Editor wird mit den Developer Tools geliefert und befindet sich in /Developer/Applications/Utilities/. Das Freeware Programm Lingon bietet eine grafische Benutzeroberfläche, in der Sie schnell und einfach eine launchd.plist erstellen können. Und das Laden und Neuladen eines Dämons oder Agents lässt sich mit einem ein Mausklick erledigen. Für das Verständnis von launchd ist allerdings die Arbeit mit dem Property List Editor sehr nützlich. Ich werde deshalb in den folgenden Beispielen beide Varianten beschreiben.


Beispiel 1: Ein Startobjekt

Dieses Beispiel eignet sich gut, um mit launchd einen ersten eigenen Agent einzurichten. Wenn Sie ein bestimmtes Programm bei jedem Neustart starten möchten, könnten Sie es wie bisher zu Ihren Startobjekten hinzufügen. Oder Sie können, wenn Sie auf launchd umsteigen möchten, eine launchd.plist erstellen. Hier eine Anleitung, wie Sie TextEdit zum Startobjekt machen können:
  1. Öffnen Sie den Property List Editor.
  2. Klicken Sie auf den Button New Root.
  3. Markieren Sie die Zeile Root, klicken Sie auf das kleine Dreieck, so dass der Pfeil nach unten zeigt, und dann auf den neu erscheinenden Button New Child.
  4. In der nun erscheinenden Zeile ist das Eingabefeld in der ersten Spalte aktiviert. An die Stelle von "New item" tippen Sie hier "Label" ein (Eingaben immer ohne Anführungszeichen).
  5. Die Voreinstellung in der Spalte Class ist "String" – da brauchen Sie nichts zu ändern. Aktivieren Sie das Eingabefeld in der Spalte Value und geben Sie hier den Namen des Agents ein, beispielsweise "TextEditStarter".
  6. Klicken Sie auf den Button New Sibling (Neues Geschwister).
  7. In der nun erscheinenden Zeile geben Sie "ProgramArguments" ins erste Eingabefeld ein.
  8. In der Spalte Class wählen Sie "Array" aus. In der Spalte Value brauchen Sie nichts einzutragen; hier wird automatisch die Anzahl der Zeilen dieses Arrays angezeigt.
  9. Klicken Sie in das kleine Dreieck neben "ProgramArguments" und dann auf den Button New Child. Es erscheint die Zeile für ein erstes Argument. Das Eingabefeld der Spalte Value ist aktivert. Hier tragen Sie das erste Programm-Argument ein: "open".
  10. Aktivieren Sie diese 0-String-Zeile und klicken Sie auf den Button New Sibling. In der neuen 1-String-Zeile tragen Sie im Eingabefeld der Spalte Value das zweite Programm-Argument ein: "/Applications/TextEdit.app".
  11. Aktivieren Sie die Zeile Root und klicken Sie auf den Button New Child. Das Eingabefeld der ersten Spalte ist aktiviert. Tippen Sie hier "RunAtLoad" ein. Beachten Sie, dass der Property List Editor die "Kinder" alphabetisch ordnet. Die Reihenfolge der Zeilen kann sich deshalb ändern, sobald Sie einen Namen eingegeben haben.
  12. Wählen Sie in der Spalte Class "Boolean" aus. In der Spalte Value wählen Sie "Yes".
  13. Sichern Sie nun Ihre plist als TextEditStarter.plist und Legen Sie sie im Ordner ~/Library/LaunchAgents ab.

Nun müssen Sie die plist noch laden. Melden Sie sich ab und wieder an oder geben Sie den folgenden Befehl ins Terminal ein:

launchctl load ~/Library/LaunchAgents/TextEditStarter.plist

TextEdit sollte sofort gestartet werden und wird nun auch nach jedem Neustart gestartet.

Beispiel 2: Ein Papierkorb auf dem Schreibtisch

Das zweite Beispiel ist für Nostalgiker. Es gibt verschiedene mögliche Gründe für einen Papierkorb auf dem Schreibtisch. Vielleicht möchten Sie ganz einfach das Dock so wenig wie möglich benutzen, vielleicht hätten Sie auch gerne ein kleines Souvenir an Ihren ersten Mac, um die ursprüngliche Faszination über die Welt des Computers wieder ein wenig aufleben zu lassen. Selbstverständlich gibt es Programme, die Sie dazu installieren könnten, aber ein selbst gebasteltes Souvenir ist naturgemäss besonders wirkungsvoll.

Um Verwechslungen zu vermeiden, nenne ich den neuen Papierkorb "Abfall". Er soll die folgenden Bedingungen erfüllen:
  • Alle Objekte, die in den Abfall gezogen werden, sollen in den Papierkorb verschoben werden.
  • Die Funktion der Tastaturbefehle soll erhalten bleiben. Ein Objekt soll mit [Befehl]-Löschtaste in den Papierkorb gelegt werden können. Der Papierkorb soll mit [Befehl]-[Shift]-Löschtaste (oder über das Finder-Menü) geleert werden können.
  • Der Abfall soll mit eigenen Icons anzeigen, ob er (bzw. der Papierkorb) leer oder voll ist.
Voraussetzungen
Eines der folgenden Skripte verwendet die Befehle seticon und wsupdate. Diese Befehle sind nicht standardmässig installiert. Sie finden Sie im Bundle osxutils, das Sie installieren müssen, damit das Skript funktioniert.

Erstellen Sie einen Neuen Ordner, nennen Sie ihn "Abfall" und legen Sie ihn auf dem Schreibtisch ab. Wählen Sie zwei Icons aus, die Sie für den leeren und den vollen Papierkorb verwenden möchten. Nennen Sie sie "abfall_leer" und "abfall_voll" und legen Sie sie in den Ordner ~/Library/Icons/.
Hier und auch sonst gilt, dass Sie natürlich auch andere Namen und Ordner verwenden können. Beachten Sie aber, dass die Namen und Pfade in den Skripts, den plists und im Finder übereinstimmen müssen.

Damit der neue Abfalleimer wie gewünscht funktioniert, brauchen Sie erstens eine "Müllabfuhr", die alle Objekte aus dem Abfall in den Papierkorb befördert, und zweitens eine "Reinigung", die den geleerten Abfalleimer wieder an den Strassenrand stellt.

Müllabfuhr
Für die Müllabfuhr benötigen Sie ein Skript, das alle Objekte des Ordners Abfall – mit Ausnahme des Icons – in den Papierkorb verschiebt. Und Sie brauchen eine plist, die das Skript startet, sobald ein Objekt in den Ordner Abfall gelegt wird.

Hier zunächst das Skript. Öffnen Sie das Terminal, wählen Sie einen Skripteditor aus (tippen Sie beispielsweise nano ein) und geben Sie den folgenden Text ein:


#!/bin/bash
find ~/Desktop/Abfall/* ! -name "Icon?" -print0 | xargs -0 -J % mv % ~/.Trash


Sichern Sie das Skript mit [Ctrl]-O, nennen Sie es abfuhr, bestätigen Sie mit der Eingabe-Taste und verlassen Sie den Skripteditor mit [Ctrl]-X. Legen Sie das Skript mit dem Terminalbefehl mv abfuhr /Applications/Shellscripts/ in den Ordner /Applications/Shellscripts/. Falls Sie diesen Ordner nicht haben müssen Sie ihn zunächst anlegen mit mkdir /Applications/Shellscripts/. Machen Sie das Skript ausführbar mit dem Terminalbefehl chmod +x /Applications/Shellscripts/abfuhr.

Nun benötigen Sie noch eine plist, um das Skript abfuhr aufzurufen, wenn ein Objekt in den Ordner Abfall gelegt wird. Hier eine Anleitung, wie Sie die plist mit Lingon erstellen können.
  1. Öffnen Sie Lingon und klicken Sie auf den Button New.
  2. Aktivieren Sie im Popup-Fenster My Agents und klicken Sie auf Create.
  3. Im neuen Popup-Fenster ist das Menü Basic aktiviert. Geben Sie ins Eingabefeld Label den Namen "abfuhr" ein
  4. Klicken Sie auf das kleine Pluszeichen neben den Eingabefeldern ProgramArguments, aktivieren Sie mit einem Doppelklick die erste Zeile und geben Sie hier “/Applications/Shellscripts/abfuhr" ein.
  5. Wechseln Sie ins Menü Paths.
  6. Klicken Sie auf das kleine Pluszeichen neben den Eingabefeldern WatchPaths, aktivieren Sie die erste Zeile und geben Sie hier "Users/benutzername/Desktop/Abfall" ein. (Ersetzen Sie benutzername durch Ihren richtigen Benutzernamen.)
  7. Klicken Sie auf den Button "Save & Load".
Reinigung
Für die Reinigung benötigen Sie ein Skript, das dem Abfalleimer das passende Icon verpasst, und eine plist, die nach jeder Änderung im Papierkorb das Skript startet. Hier zunächst das Skript. Öffnen Sie das Terminal, wählen Sie einen Skripteditor aus und geben Sie den folgenden Text ein:


#!/bin/bash
if [ -d "$HOME/.Trash" ]
then
VAR1="$(ls -l $HOME/.Trash | wc -l)"
if [ $VAR1 = 0 ]
then
/usr/local/bin/seticon $HOME/Library/Icons/abfall_leer $HOME/Desktop/Abfall
/usr/local/bin/wsupdate $HOME/Desktop/Abfall
else
/usr/local/bin/seticon $HOME/Library/Icons/abfall_voll $HOME/Desktop/Abfall
/usr/local/bin/wsupdate $HOME/Desktop/Abfall
fi
else
mkdir $HOME/.Trash
fi


Sichern Sie das Skript, nennen Sie es reinigung, legen Sie es mit dem Terminalbefehl mv reinigung /Applications/Shellscripts/ in den Ordner /Applications/Shellscripts/ und machen Sie es ausführbar mit dem Terminalbefehl chmod +x /Applications/Shellscripts/reinigung.

Die plist muss das Skript reinigung immer dann starten, wenn ein Objekt in den Papierkorb gelegt oder wenn der Papierkorb geleert wird.
  1. Öffnen Sie Lingon und klicken Sie auf den Button New.
  2. Aktivieren Sie im Popup-Fenster My Agents und klicken Sie auf Create.
  3. Geben Sie im Menü Basic ins Eingabefeld Label den Namen "reinigung" ein
  4. Aktivieren Sie die erste Zeile im Eingabefeld ProgramArguments und geben Sie hier “/Applications/Shellscripts/reinigung" ein.
  5. Aktivieren Sie die Option RunAtLoad.
  6. Wechseln Sie ins Menü Paths, aktivieren Sie die erste Zeile im Eingabefeld WatchPaths und geben Sie hier "/Users/benutzername/.Trash" ein. (Ersetzen Sie benutzername durch Ihren richtigen Benutzernamen.)
  7. Klicken Sie auf den Button "Save & Load".

Damit haben Sie Ihren eigenen Papierkorb auf dem Schreibtisch. Er funktioniert, ist aber ein wenig fehleranfällig. Zudem kann er keine gemounteten Volumes auswerfen; vielleicht findet sich ja jemand, der eine Ergänzung bastelt...



6. Quellenangaben

Grundlegend für alles Weitere sind die man pages (selbstverständlich auch im Terminal zu finden) und die Apple Developer Seiten:Weitere wichtige Quellen:
Erstellt von donquichote am 01.01.2006 um 19:17 Uhr | Hits: 66953
Hint Optionen
Kommentare
Die folgenden Kommentare geben die persönliche Meinung des jeweiligen Autors wieder. «Mac OS X Hints» übernimmt dafür keine Verantwortung.
Erstellt von: yanux am 09.01.2006 um 19:17 Uhr
Super Hint :)





 
top top