Shellscript beim Login ausführen

chrigu

chrigu

Aktives Mitglied
Thread Starter
Dabei seit
08.03.2004
Beiträge
155
Reaktionspunkte
0
Ich habe ein Script gebastelt, das meine zweite Festplatte unmountet. Das Script /Library/Management/maryjane_unmount.sh läuft einwandfrei.

Nun möchte ich beim Startvorgang dieses Script ausführen lassen, hab e bissle recherchiert.

Doch leider will es mit diesem LoginHook nicht so recht funktioneren, habe wie in der Anleitung beschrieben sudo defaults write /Library/Preferences/com.apple.loginwindow LoginHook /Library/Management/maryjane_unmount.sh ausgeführt, doch bei einem Neustart wie auch bei einer Neuanmeldung erscheint meine Festplatte, wie gewohnt auf dem Schreibtisch.

Gibt es eine Möglichkeit, die Präferenzdatei com.apple.loginwindow einzusehen gegebenenfalls zu editieren?
 
Dein Ansatz sieht durchaus richtig aus. Es koennte unter Umstaenden was mit den Zugriffsrechten zu tun haben das dein script nich ausgefuehrt wird. Was sagt denn die Konsole (return code). Es gibt von Herrn Bombich auch das login window management tool, mit dem man den loginhook ueber ein GUI einbinden kann (http://www.bombich.com/software/lwm.html). Hast du das mal probiert?

Cheers,
Lunde
 
Den LoginWindow Manager hab ich auch ausprobiert, das heisst den Pfad fürs Script angegeben, getestet und vom LoginWindow Manager als executable befunden und natürlich Apply gedrückt, nach dem Neustart erschien die Festplatte wieder, Script sieht übrigens so aus

#!/bin/sh

diskutil unmount /Volumes/maryjane


maryjane_unmount.sh habe ich mit chmod 755 ausgeführt und verfügt nun über folgende Rechte: –rwxr-xr-x root admin

über die Konsole bekomme ich Volume /Volumes/maryjane unmounted zurück. Ist das der Return Code?

Ich frage mich schon ziemlich was hier falsch läuft. Gäbe es by the way noch eine andere Möglichkeit das Script während des Starts automatisch ausführen zu lassen?
 
Diese Aufgabe schreit geradezu nach einem StartupItem.

Ein StartupItem wird beim booten (also nicht erst bei der Anmeldung eines Benutzers) augeführt.
Ein weiterer Vorteil ist, dass Du Dein Skript ggf. mithilfe der Datei /etc/hostconfig sehr einfach ein- und ausschalten kannst.

Falls Du die DevTools installiert hast, findest Du hier eine Anleitung.
Falls Du diesen Weg einschlagen möchtest und nicht weiterkommst, melde Dich einfach nochmal kurz.
 
Schon mal Danke für deine zuvorkommende Hilfe!

Die DevTools habe ich nicht installiert.
Hab auch schon in Forum gesucht nach Anleitungen für ein sogenanntes Startup Item, aber nur herausgefunden, dass man nicht einfach so ein Shellscript in das Startup Item Verzeichnis legen kann.

Ich wäre dir also sehr dankbar für ne kurze Einführung oder Anleitung
 
Dieselbe Anleitung wie in den DevTools gibts auch bei Apple online und zwar hier.

Ich habe mal kurz über die Anleitung von ._ut geschaut.
Dabei ist mir eingefallen, dass ich im auch schon mal ne Anleitung zum automatischen Mounten von AFP Shares geschrieben habe.
Die "StartupParameters.plist" habe ich in Normaltext geschrieben.
Das geht auch und scheint mir einfacher zu sein.

HTH
 
Ok, ich hab mal ein bisschen gearbeitet. Hab zwar keine grosse Ahnung, aber korrigiert mich, wenn ich es falsch verstehe.

Das Script befindet sich nun ich nun in /Library/StartupItems/unmountDisk
und heisst unmountDisk

#!/bin/sh

. /etc/rc.common

##
# unmountDisk
##

if [ "${UNMOUNTDISK:=-NO-}" = "-YES-" ]; then
ConsoleMessage "unmountDisk maryjane"
diskutil unmount /Volumes/maryjane
fi

Es gibt anscheinend sogenannte RunServices, brauch ich die oder wozu sind sie da? Nach meiner Vorstellung müsste ich nur noch in /etc/hostconfig folgendes Eintragen: UNMOUNTDISK=-YES-.

Bei der StartupParameters.plist, die im gleichen Verzeichnis liegt, habe ich schon mehr Fragen.

{
Description = "unmountDisk";
Provides = ("unmount a Disk");
Requires = ("Disks");
Uses = ("");
Preference = "None";
}

Description und Provides scheinen nicht so wichtig zu sein. Bei Requires und Uses bin ich mir nicht sicher, da ich nicht weiss was es überhaupt an Services gibt. Aber von mir aus gesehen müssten zuerst alle Disks gemountet werden, bevor der Befehl diskutil unmount ausgeführt werden kann. Was müsste ich bei Uses einfügen?

Thanx
 
Zuletzt bearbeitet:
AFAIR verhält es sich folgendermaßen:
"Requires" sind Services, die gestartet sein müssen , damit Dein StartupItem überhaupt geladen wird.
"Uses" ist für das System von Bedeutung, um festzulegen, in welcher Reihenfolge die Dienste bzw. StartupItems gestartet werden sollen.
Hier könnte ein StartupItem stehen, dass zwar vor Deinem geladen werden soll, aber wenn es nicht oder nicht erfolgreich gestartet wird, hat das keinen Einfluss.
Allerdings spielt für die Reihenfolge auch "Preference" eine Rolle.

Nach meiner Vorstellung müsste ich nur noch in /etc/hostconfig folgendes Eintragen: UNMOUNTDISK=-YES-.
So ist es. Durch die Konstruktion "${UNMOUNTDISK:=-NO-}" = "-YES-" wird der Wert von $UNMOUNTDISK auf -NO- gesetzt, wenn die Variable nicht existiert oder leer ist.

[edit]Ergänzung:
"The RunService routine looks for StartService, StopService, and RestartService routines in your shell script and calls them to start, stop, or restart your services as needed. You must provide implementations for all three routines, although the implementations can be empty for routines whose commands your service does not support."[/edit]

Mein Vorschlag:
Code:
#!/bin/sh

. /etc/rc.common

##
# unmountDisk
##

StartService ()
{
if [ "${UNMOUNTDISK:=-NO-}" = "-YES-" ]; then
ConsoleMessage "unmountDisk maryjane"
diskutil unmount /Volumes/maryjane
fi
}

StopService ()
{}

RestartService ()
{}

RunService "$1"
 
Zuletzt bearbeitet:
Danke, Theoretisch habe ich es nun kapiert, jetzt liegts wohl am praktischen, weil es leider noch nicht funktioniert. Poste mal mein Script und hoffe jemand hat Adleraugen.

Das unmountDisk Script liegt in /Library/StartupItems/unmountDisk und hat Rechte: -rwxr-xr-x


#!/bin/sh

. /etc/rc.common

##
# unmountDisk
##

StartService ()
{
if [ "${UNMOUNTDISK:=-NO-}" = "-YES-" ]; then
ConsoleMessage "unmountDisk maryjane"
diskutil unmount /Volumes/maryjane
fi
}

StopService ()
{}

RestartService ()
{}

RunService "$1"

Das StartupParameters.plist liegt in /Library/StartupItems/unmountDisk und hat Rechte: -rwxr-xr-x

{
Description = "unmountDisk";
Provides = ("unmount a Disk");
Requires = ("Disks");
Uses = ("");
Preference = "None";
}

In /etc/hostconfig sieht es unten so aus:
# Services
AFPSERVER=-NO-
AUTHSERVER=-NO-
AUTOMOUNT=-YES-
CUPS=-YES-
IPFORWARDING=-NO-
IPV6=-YES-
MAILSERVER=-AUTOMATIC-
NETINFOSERVER=-AUTOMATIC-
NFSLOCKS=-AUTOMATIC-
NISDOMAIN=-NO-
RPCSERVER=-AUTOMATIC-
TIMESYNC=-YES-
QTSSERVER=-NO-
WEBSERVER=-NO-
SMBSERVER=-NO-
DNSSERVER=-NO-
COREDUMPS=-NO-
VPNSERVER=-NO-
MYSQL=-NO-
UNMOUNTDISK=-YES-

Sollte doch gehen oder?
 
Ok, ich habs gesehen

Folgendes Script funktioniert:

#!/bin/sh

. /etc/rc.common

##
# unmountDisk
##

StartService ()
{
if [ "${UNMOUNTDISK:=-NO-}" = "-YES-" ]; then

ConsoleMessage "unmountDisk maryjane"
diskutil unmount /Volumes/maryjane

fi
}

StopService ()
{
return 0
}

RestartService ()
{
return 0
}

RunService "$1"
 
Wie man sieht steckt der Teufel wieder mal im Detail.
Bei meinen beiden StartupItems habe ich natürlich return 0 drin.
Hab´s nur übergangen. *schäm*
 
Naja, ich habs bei deinem Script abgeguckt… ;)

Würd mich nur noch interessieren, warum return 0 ? Was bewirkt dies?
Muss man jeder Funktion (ich nehme an, dass es eine ist :rolleyes:) einen Inhalt geben?
 
chrigu schrieb:
Naja, ich habs bei deinem Script abgeguckt… ;)

Würd mich nur noch interessieren, warum return 0 ? Was bewirkt dies?
Muss man jeder Funktion (ich nehme an, dass es eine ist :rolleyes:) einen Inhalt geben?

Ja, nur oben in diesem Fred hab ich es nicht mehr reingeschrieben.

return 0 liefert einen (man kann es sich schon denken) return-code.
Bei dem Start-Teil wird der return-code von den Kommandos zurückgegeben.
In Skripten und Programmen kann man auch auf bestimmte Fehlersituationen mit bestimmten return-codes reagieren und dem Benutzer so die Fehlersuche erleichtern. Dazu gehört natürlich i. d. R. dass die return-codes dokumentiert werden

Wenn man in dem Stop- und Restart-Teil auch Skript-Kommandos reinschreibt, kann man das StartupItem übrigens auch zum manuellen Beenden und Neu-Starten von Diensten o. ä. verwenden.
 
edited by w
 
Zuletzt bearbeitet:
Woulion schrieb:
Kann der SystemStarter kein sudo?

Klärt mich auf, ich will nicht googeln

W

Ob der Systemstarter sudo kann, weiss ich nicht, ich vermute schon, da es ein normales Kommando ist.
Ich denke aber, dass sudo überflüssig ist, da afair StartupItems grunsätzlich mit root-Rechten laufen ;)

Wenn Du die Befehle in ein Skript schreibst, arbeitest Du dann auch mit "cd" und relativen Pfaden ?
Hast Du schon mal versucht, absolute Pfade zu verwenden ?

Was mir außerdem auffällt, ist, dass dein Skript nicht in einem Ordner mit dem selben Namen in "/Library/StartupItems/" liegt.
Das ist in der Docu so gefordert, ob es einen Einfluß hat, weiss ich nicht.

Warum Du dem Kommando ein "sh" voranstellst versteh ich nicht; wenn dein Skript x-Rechte hat, sollte das nicht erforderlich sein.
 
Zuletzt bearbeitet von einem Moderator:
Hi

Erst mal Danke für die Antworten, insbesondere der Link sieht gut aus. Das klärt zwar nicht unbedingt meine Frage, aber es ist ja auch nicht so wichtig da alles soweit funzt. Hoffentlich finde ich irgendwann mal die Zeit das alles zu lesen.

BTW: Es ist tröstlich, das wenigstens an einigen Stellen noch fachlich diskutiert wird

CU folks

W
 
In /etc/hostconfig sieht es unten so aus:
# Services
AFPSERVER=-NO-
AUTHSERVER=-NO-
AUTOMOUNT=-YES-
CUPS=-YES-
IPFORWARDING=-NO-
IPV6=-YES-
MAILSERVER=-AUTOMATIC-
NETINFOSERVER=-AUTOMATIC-
NFSLOCKS=-AUTOMATIC-
NISDOMAIN=-NO-
RPCSERVER=-AUTOMATIC-
TIMESYNC=-YES-
QTSSERVER=-NO-
WEBSERVER=-NO-
SMBSERVER=-NO-
DNSSERVER=-NO-
COREDUMPS=-NO-
VPNSERVER=-NO-
MYSQL=-NO-
UNMOUNTDISK=-YES-
Sollte doch gehen oder?

Hallo,

was würde eigentlich passieren, wenn man in der /etc/hostconfig AUTOMOUNT einfach auf -NO- setzt?

Ich möchte gerne mit gedrückter ALT-Taste den Rechner hochfahren und mich dann für die eine (Panther) oder die andere Platte (Tiger) entscheiden. Die jeweils andere Platte soll nicht gemountet werden.

Leider habe ich von Unix fast keine und von Skripten gar keine Ahnung.

Kann mir da jemand weiterhelfen?

Viele Grüße
Lutz
 
Zurück
Oben Unten