Problem mit selbst erstelltem "launchd" Job

echt0711

echt0711

Aktives Mitglied
Thread Starter
Dabei seit
11.10.2003
Beiträge
862
Reaktionspunkte
13
So ich hatte jetzt mal Gelegenheit mit launchd herumzuexperimentieren. Ich habe dafür das Lingon Tool verwendet (http://lingon.sourceforge.net/)

Leider habe ich es nicht hinbekommen, daß launchd jeden Tag zum gewünschten Zeitpunkt meine externe Festplatte unmounted...

entweder er wirft sie direkt wieder aus nachdem ich sie mounte, oder er reagiert garnicht... kann mir da jemand helfen?

Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>backupvolumedismount</string>
	<key>LowPriorityIO</key>
	<true/>
	<key>Nice</key>
	<integer>1</integer>
	<key>OnDemand</key>
	<true/>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/sbin/diskutil</string>
		<string>unmount</string>
		<string>/Volumes/305gb_backup</string>
	</array>
	<key>RunAtLoad</key>
	<false/>
	<key>StartCalendarInterval</key>
	<dict>
		<key>Hour</key>
		<integer>12</integer>
		<key>Minute</key>
		<integer>28</integer>
	</dict>
	<key>UserName</key>
	<string>root</string>
</dict>
</plist>

Wenn ich den "OnDemand" Flag wegnehme, startet der Job scheinbar immer sofort (quasi als Loop). Die Fehlermeldungen im system.log sehen dann so aus:

Code:
Jan 11 12:15:49 dual-g5 launchd: backupvolumedismount: respawning too quickly! throttling
Jan 11 12:15:49 dual-g5 launchd: backupvolumedismount: 9 more failures without living at least 60 seconds will cause job removal
Jan 11 12:15:49 dual-g5 launchd: backupvolumedismount: will restart in 10 seconds

Wenn ich den Flag hingegen anschalte, passiert garnichts.
Was mache ich falsch?

Außerdem die Frage: Brauche ich den root User?
Die Platte soll ja auch zum richtigen Zeitpunkt ausgeworfen werden, falls kein User angemeldet ist, weil sie 5 Minuten später vom Stromnetz getrennt wird (externe SATA Festplatte, hängt an einer normalen Zeitschaltuhr um die Platte zu schonen)
 
Zuletzt bearbeitet:
: den thread push :

hat wirklich keiner eine idee? :(
 
Nun, da gibt es einiges zu sagen/fragen:
  1. launchd hatte von Anfang an einen Bug was die zeitgesteuerte Ausführung von Skripten angeht. Der sollte eigentlich mit 10.4.1 schon behoben werden, was aber bisher nicht geschehen ist.
    Das scheint aber hier nicht das primäre Problem zu sein.
  2. Bei OnDemand ist "true" ohnehin der Default Wert, daher sollte es eigentlich keinen Unterschied machen, wenn Du es weglässt. Bei RunAtLoad sieht es übrigens ähnlich aus, nur dass der Default Wert "false" ist.
  3. Der key "UserName" ist mir unbekannt und auch undokumentiert. Woher hast Du den?
  4. Wo ist die plist Datei gespeichert, mit welchen Rechten, wie heisst Sie, und wie lädst Du sie?

Ich schieb Dich mal nach Unix; ich denke, da passt Deine Frage besser hin.

[edit]
echt0711 schrieb:
...
Die Platte soll ja auch zum richtigen Zeitpunkt ausgeworfen werden, falls kein User angemeldet ist, weil sie 5 Minuten später vom Stromnetz getrennt wird (externe SATA Festplatte, hängt an einer normalen Zeitschaltuhr um die Platte zu schonen)
Das wird wegen des o.g. Bugs derzeit ohnehin nur dann klappen, wenn der Rechner niemals in den Ruhezustand geht.
 
man launchd.plist

UserName <string>
This optional key specifies the user to run the job as. The default is
the user who submitted the job to launchd.

ist aber nutzlos das als root zu setzen, weil launchd eh die jobs als root fährt, solang man es nicht anders will, oder?
 
oneOeight schrieb:
man launchd.plist
[...]
ist aber nutzlos das als root zu setzen, weil launchd eh die jobs als root fährt, solang man es nicht anders will, oder?
Ich hatte zwar in die manpage geschaut, hatte aber offensichtlich Tomaten auf den Augen gehabt.
Danke für die Berichtigung.

Ob ein Job per default als root läuft, hängt auch davon ab, wo die .plist gespeichert ist, i.d.R. ist es aber so.
 
Moinmoin!

Cool, ich hatte die Hoffung schon aufgegeben ;)

maceis schrieb:
Nun, da gibt es einiges zu sagen/fragen:
  1. Bei OnDemand ist "true" ohnehin der Default Wert, daher sollte es eigentlich keinen Unterschied machen, wenn Du es weglässt. Bei RunAtLoad sieht es übrigens ähnlich aus, nur dass der Default Wert "false" ist.
  2. Der key "UserName" ist mir unbekannt und auch undokumentiert. Woher hast Du den?
  3. Wo ist die plist Datei gespeichert, mit welchen Rechten, wie heisst Sie, und wie lädst Du sie?

Den Key Username hat mir Lingon ( http://lingon.sourceforge.net/ ) generiert, über dieses Tool habe ich versucht den launchd job zu erstellen.

Die plist liegt in /Library/LaunchDaemons

Und die Rechte der Datei sind auf
Eigentümer: System (Lesen/Schreiben)
Gruppe: wheel (nur lesen)
Andere: (nur lesen)

Geladen wird die plist über launchd, dachte ich? :rolleyes:
Bzw. eben "on demand", zur in der plist eingestellten Uhrzeit... oder funktioniert das etwa ganz anders?

Sorry - Mein Halbwissen, vermute ich! Bin allerdings aus http://developer.apple.com/macosx/launchd.html auch nur halb schlau geworden…

Ich hab mir angeschaut, wie Apple seine "daily" und "weekly" scripts angelegt hat und versucht, deren Parameter für meine Zwecke zu übernehmen.

In Lingon stelle ich den Kram ein, klicke auf "load and save" und nichts passiert.... oder ich klicke auf "runatload", dann wirft der die platte sofort aus, sobald ich "save and load" klicke… also zumindest mein Aufruf "/usr/sbin/diskutil unmount /Volumes/Namederplatte" scheint korrekt zu sein…

Das getimte Ausführen funktioniert nicht...

Das wird wegen des o.g. Bugs derzeit ohnehin nur dann klappen, wenn der Rechner niemals in den Ruhezustand geht.

Das ist gewährleistet. Nach 15 Minuten geht der Monitor off, der Ruhezustand steht allerdings auf "nie" und die internen Platten drehen auch die ganze Zeit weiter. Die Kiste, auf der der Job laufen soll ist der Fileserver für eine kleine Arbeitsgruppe. Es geht mir nur darum daß die Backupfestplatte geschont wird was deren Laufzeit angeht, daher hab ich sie an eine Zeitschaltuhr geklemmt, die nur 3 Stunden am Tag Strom auf die externe Platte gibt. Bevor der Strom aus geht, muss die Platte allerdings geunmounted werden - das ist das ganze Problem.

Ne sehr kreative Backup-Lösung, ich weiss - aber besser als die externe Platte die ganze Zeit online zu lassen, immerhin ist es eine SATA und keine SCSI Platte ;)
 
echt0711 schrieb:
...
Die plist liegt in /Library/LaunchDaemons

Und die Rechte der Datei sind auf
Eigentümer: System (Lesen/Schreiben)
Gruppe: wheel (nur lesen)
Andere: (nur lesen)
...
passt
echt0711 schrieb:
...
Geladen wird die plist über launchd, dachte ich? :rolleyes:
Bzw. eben "on demand", zur in der plist eingestellten Uhrzeit... oder funktioniert das etwa ganz anders?
...
AFAIK werden ist die Funktionaltät OnDemand mit inetd bzw. xinetd vergleichbar. Mit OnDemand ist die Anfrage auf einem bestimmten Socket gemeint (bei Netzwerk Daemons).

echt0711 schrieb:
...
Ich hab mir angeschaut, wie Apple seine "daily" und "weekly" scripts angelegt hat und versucht, deren Parameter für meine Zwecke zu übernehmen.

In Lingon stelle ich den Kram ein, klicke auf "load and save" und nichts passiert.... oder ich klicke auf "runatload", dann wirft der die platte sofort aus, sobald ich "save and load" klicke… also zumindest mein Aufruf "/usr/sbin/diskutil unmount /Volumes/Namederplatte" scheint korrekt zu sein…
...
Das macht Sinn, RunAtLoad bedeutet ja, "führe den Job aus, sobald er geladen wird", also beim Booten/Anmelden oder beim manuellen Laden. und genau das beschreibst Du ja auch so.

Hast Du mal beobachtet, ob die periodic-jobs bei Dir zur richtigen Zeit laufen? Das sollten sie eigentlich, wenn der Rechner nie schläft.

Ich würde an Deiner Stelle einen periodic-job nach /Library/LaunchDaemons kopieren und manuell bearbeiten und laden.
Damit solltest Du zum richtigen Ergebnis kommen.

HTH
 
Hi und moin!

Gute Idee, das mit den periodic jobs… also um 3:15uhr hat der rechner vor ein paar tagen auf jeden Fall gerattert (war da noch wach), es gibt in der konsole rotierte logfiles und daily output meldungen usw... schätze also daß die periodic scripts laufen ;)

wo liegen denn die plists für die periodic jobs? Im Verzeichnis /Library/LaunchDaemons liegt nämlich außer meiner eigenen plist garnichts drin...
Und Spotlight konnte ich (leider) noch nicht dazu überreden, mir auch Files mit ".name" und aus den "private" Verzeichnissen anzuzeigen. Es fehlt eindeutig die "show Unix Stuff and Manpages" Checkbox in Spotlight :D
 
Edit: Habs gefunden. Die System launchd Daemons liegen auf /System/Library/LaunchDaemons

Hab da mal meine plist reinkopiert und hoffe, daß sie ausgeführt wird…
Muss ich die plist bei launchd noch irgendwie bekannt machen bzw. "laden"? Wie geht das manuell?
 
echt0711 schrieb:
Edit: Habs gefunden. Die System launchd Daemons liegen auf /System/Library/LaunchDaemons

Hab da mal meine plist reinkopiert und hoffe, daß sie ausgeführt wird…
Muss ich die plist bei launchd noch irgendwie bekannt machen bzw. "laden"? Wie geht das manuell?
Selbsterstellte jobs gehören nach /Library/LaunchDaemons; /System/... ist für die Apple Jobs.

Zum Laden eines Jobs:
Code:
launchctl load [-w] /Library/LaunchDaemons/job.plist
der Schalter -w sorgt dafür, dass ein ggf. vorhandener Disable true entfernt wird.

HTH
 
Okay ich danke Dir vielmals :) Der Job liegt jetzt in /Library/LaunchDaemons

Hab launchctl load ausgeführt und konnte mich in Lingon davon überzeugen, daß der Job geladen wurde. Hab ihn auf 16:45 Uhr getimed (16 ist dafür die korrekte Stundenangabe in der plist oder?)

Er hat leider nix gemacht, obwohl ich direkt die periodic-daily plist genommen habe und nur den "array" und die uhrzeit neu geschrieben habe :(

Die plist sieht jetzt so aus:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>com.mk.unmountbackup</string>
	<key>LowPriorityIO</key>
	<true/>
	<key>Nice</key>
	<integer>1</integer>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/sbin/diskutil</string>
		<string>unmount</string>
		<string>/Volumes/305gb_backup</string>
	</array>
	<key>StartCalendarInterval</key>
	<dict>
		<key>Hour</key>
		<integer>16</integer>
		<key>Minute</key>
		<integer>45</integer>
	</dict>
</dict>
</plist>

Dateiname der plist: /Library/LaunchDaemons/com.mk.unmountbackup.plist

Woran könnte es noch liegen?? Ich werd so langsam garnicht mehr so wirklich schlau…
 
Zuletzt bearbeitet:
Schon mal "unmount force" versucht?
Ansonsten würde ich mal ein einfaches Skript versuchen, in dem nur "touch /tmp/launchdjob.`date +%H:%M:%S` steht und beobachten, ob die Dateien angelegt werden.
Damit kannst Du die Fehlerursache möglicherweise eingrenzen.

Welche Jobs geladen sind kannst Du übrigens auch sehr einfach mit "sudo launchctl list" prüfen.
 
Ich glaub ich hab den Fehler gefunden - zumindest ist hier was, was mir absolut spanisch vorkommt:
Code:
localhost:~ mac_root$ sudo launchctl list
com.mkn.unmountbackup
org.mysql.mysqld
com.apple.KernelEventAgent
com.apple.mDNSResponder
com.apple.nibindd
com.apple.periodic-daily
com.apple.periodic-monthly
com.apple.periodic-weekly
com.apple.portmap
com.apple.syslogd
com.vix.cron
org.postfix.master
org.xinetd.xinetd
edu.washington.pop3
edu.washington.pop3s
localhost:~ mac_root$ launchctl unload /Library/LaunchDaemons/com.mk.unmountbackup.plist     
No such process
localhost:~ mac_root$

Der Job ist also angeblich geladen, wird aber nicht gefunden wenn ich ihn "unloaden" will? was ist denn da los?
 
Zuletzt bearbeitet:
Ich hab "ein wenig" recherchiert was launchd angeht.

Um das Ergebnis knapp zusammenzufassen, was Deine Anforderungen angeht, kann man sagen: "Schreib' die Kommandos in ein Skript und starte dieses mit einem passenden Eintrag in /etc/crontab".
 
hmm okay :) also doch über cron? Das hatte ich ja probiert und nachdem mein "altes" cron script (noch aus 10.3.9 übernommen) unter tiger nicht lief bin ich überhaupt erst auf launchd gekommen… okay ich probiers nochmal per cron tab! danke dir für die vielen tipps und ratschläge! werd das ja wohl irgendwie noch hinkriegen :D
 
So hab das jetzt probiert - mit dem Shellscript und Aufruf aus der Crontab funktioniert alles bestens. Habe das vorher immer mit dem direkten Aufruf des "diskutil" Kommandos aus der Crontab heraus gemacht…*vielleicht funktioniert ja das Shellscript auch aus launchd?

Aber ne andere Frage wäre mir viel dringender: Wo sollte ich das Shellscript ablegen? Habs der einfachheit halber nach /Users/Shared gespeichert... gibts für so ein Script einen prädestinierten Ort?
 
Du könntest z.B. den Ordner "/usr/local/bin" verwenden oder auch einen eigenen Ordner /"usr/local/scripts" dafür anlegen.
Zweiteres macht IMHO Sinn, wenn Du eine Reihe von Shellskripten verwendest, die Du zusammen behalten möchtest.

Eine weitere Alternative wäre es, das ganze mit periodic auszuführen.
In dem Fall gehöhren solche Skripte natürlich in ein Unterverzeichnis von /etc/periodic.

Was die Ausführung mit launchd angeht, ist die Situation, dass das nur unter gewissen Voraussetzungen zuverlässig funktioniert.

Ein entscheidender Punkt scheint zu sein, dass man beim Testen darauf achten muss, bei Skripten für die es einen key "Hour" gibt, den job mindestens zwei bis drei Stunden vor der ersten Ausführung zu laden.

Bei Mac OS X < 10.4.2 gibt es einen weiteren Bug in launchd, der bewirkt, dass ein Kalender Job nur einmal ausgeführt wird.
Die Geschichte mit dem Timer, der nur läuft, wenn der Rechner nicht schläft ist IMHO ein Design Bug und ein Dokumentations Bug.
StartCalendarInterval soll ja schließlich funktionieren wie cron - tut es aber nicht.
 
Komme leider viel zu spät damit, und weiss auch gar nicht, ob das weiter geholfen hätte. Aber hier noch ein brauchbarer Link zu launchd:
 
@maceis: Das würde erklären, wieso ich beim Testen mit launchd immer solche Probleme hatte…*ich habe meist meine Platte angeklemmt und dann den Job auf "in ca. 5 Minuten" getimed - aber wenns da noch solche Bugs gibt, sollte man den ganzen getimten Kram wohl wirklich besser über Cron laufen lassen. Witzig nur, daß der direkte Aufruf von "diskutil" aus der Crontab nicht mehr funktioniert hat - in 10.3.9 ging das noch…*Hmmm Bug oder Feature? ;)

Auf jeden Fall hab ich jetzt mein erstes hochoffizielles Shell Script zum Laufen gebracht und bin schon ganz arg stolz und danke nochmals für die viele Hilfe!

Endlich tut wieder alles wie zu Panther-Zeiten, wenn auch etwas aufwendiger vom Handling her.

@murks: Auf alle Fälle ein informativer Link, les mich gerade durch! Thanks vielmals.
 
edit: jetzt ist mir doch ein kleiner Schönheitsfehler aufgefallen...

Kann es sein, daß das OS eine externe Festplatte nur mounted, wenn auch ein User an der GUI eingeloggt ist? Vorgestern war am Rechner nämlich zum Zeitpunkt des Backups niemand angemeldet tags drauf stand im Log von Deja Vu (das ist die Backup Shareware), daß das Backup Volume nicht gefunden wurde.

Gestern, als ich zum Zeitpunkt des Backups mit einem User angemeldet war, hat hingegen alles normal funktioniert.

Muss ich evtl. per "diskutil mount" sicherstellen, daß die Platte gemounted wird, kurz nachdem sie anspringt?
 
Zurück
Oben Unten