OSX-Run-Skript zum Einhängen von sshfs bei der Anmeldung mit einer plist-Datei

2939
jason

Ich habe die Manpages zu plist und launchd.plist durchgelesen, sowie Beiträge zum Verwenden von plist-Dateien zum Ausführen von Skripts beim Anmelden. aber ich kann scheinen, die Dinge zum Laufen zu bringen.

Standort und Berechtigungen meines Skripts:

sshfs_mounts.sh:

ls -al Library/scripts/  -rwxr-xr-x 1 jason staff 288 May 10 17:06 sshfs_mounts.sh 

cat Library/scripts/sshfs_mounts.sh

#!/bin/bash # ## automounting of sshfs directories mount_cosmic () { /usr/local/bin/sshfs jason@iss.nasa.gov:/media/NetworkShare/spacedock-1 /Users/jason/share; } mount |grep "/Users/jason/share/" if [ $? == 1 ] && [ -d "/Users/jason/share" ] && [ $USER == "jason" ]; then mount_cosmic fi 

AUS ORIGINAL POST BEARBEITET:

Wenn ich das Skript manuell ausführe, wird es wie erwartet ausgeführt. Ich kann plist ( launchctl load ~/Library/LaunchAgents/local.sshfs.plist) laden und starten ( launchctl start ~/Library/LaunchAgents/local.sshfs), aber das Skript wird nicht ausgeführt. In den Logs ( cat /var/log/system.log |grep local.sshfs) bekomme ich:

May 11 09:30:26 rover com.apple.launchd.peruser.504[305] (local.sshfs.plist): Throttling respawn: Will start in 10 seconds 

Hier sind mein Standort und meine Berechtigungen für die Plist-Datei:

ls -al Library/LaunchAgents/local.sshfs.plist  -rw-r--r-- 1 jason staff 419 May 10 18:14 Library/LaunchAgents/local.sshfs_mounts.plist 

Und die Akte (BEARBEITET nach Gordons Rat ^ 2):

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>KeepAlive</key> <true/> <key>Label</key> <string>local.sshfs.plist</string> <key>ProgramArguments</key> <array> <string>/bin/sh</string> <string>/Users/jason/Library/scripts/sshfs_mounts.sh</string> </array> <key>RunAtLoad</key> <true/> <key>StandardErrorPath</key> <string>/tmp/sshfs_mounts.err</string> <key>StandardOutPath</key> <string>/tmp/sshfs_mounts.out</string> </dict> </plist> 

Mahalo im Voraus.

3

2 Antworten auf die Frage

5
Gordon Davisson

The "no plist was returned" error means that it was unable to parse the .plist file. I see two problems offhand: Lable should be Label, and </true> should be <true/>. You can use the command plutil -lint ~/Library/LaunchAgents/local.sshfs_mounts.plist to check the plist syntax, although it will not detect whether the data in the plist is valid as a launchd item.

Ihr Beitrag war sehr hilfreich. Die Plist-Datei wird jetzt ohne Probleme geladen und ich kann sie mit `lanchctl` starten. Ich werde meinen bearbeiteten Code posten. Das Problem ist jetzt jedes Mal, wenn ich die plist-Datei starte, es schlägt fehl und ich bekomme Folgendes in der `system.log`:` Exited with code: 127` jason vor 10 Jahren 0
Exit-Status 127 bedeutet im Allgemeinen, dass der Befehl nicht gefunden wurde. Befindet sich der Befehl sshfs in einem der Standardverzeichnisse von PATH oder in einem Verzeichnis, das Sie in Ihrem .bash_profile hinzufügen? Wenn dies das Problem ist, geben Sie entweder den vollständigen Pfad im Skript an (z. B. `/ usr / local / bin / sshfs jason @ ...`) oder setzen Sie den Pfad in das Skript entsprechend. Wenn dies nicht das Problem ist, versuchen Sie, die Ausgabe des Skripts zu erfassen, indem Sie `hinzufügenStandardOutPath/tmp/sshfs_mounts.outStandardErrorPath/tmp/sshfs_mounts.err`zur .plist-Datei und prüfen, ob dadurch das Problem beleuchtet wird. Gordon Davisson vor 10 Jahren 1
Sie helfen mir dabei, alle Fehler zu beseitigen, aber das Skript läuft immer noch nicht. Ich habe das Skript wie von Ihnen vorgeschlagen geändert und auch die Ausgabe umgeleitet. Ich bekomme nichts in `sshfs.out` oder` sshfs.err`. Außerdem ist die Ausgabe in `/ var / log / system.log`` Throttling respawn: Startet in 10 Sekunden. ' Beispielcode aktualisiert. jason vor 10 Jahren 0
Ich habe gerade bemerkt, dass Sie `KeepAlive` auf` gesetzt habenbedeutet, dass das Skript von startd neu gestartet wird, wenn das Skript aus irgendeinem Grund beendet wird. Beendet `sshfs` nach dem Einhängen des Servers? Wenn ja (oder wenn die `if`-Anweisung nicht ausgeführt wird), bedeutet dies, dass launchd das Skript immer wieder ausführt, obwohl die Relaunch-Rate alle 10 Sekunden gedrosselt wird. Ansonsten kann das Skript den Server erfolgreich einhängen? Wenn nicht, sollten Sie einige "Echo" -Befehle hinzufügen, um die Debugging-Ausgabe zu geben, damit Sie herausfinden können, was falsch ist. Gordon Davisson vor 10 Jahren 1
4
jason

Dank Gordon, der mir bei der Fehlerbehebung half, konnte ich die plist-Datei richtig formatieren lassen (ich habe am Ende plistEdit pro verwendet, da plists sehr wählerisch sind und ein Text-Editor verwendet, was für mich nicht funktionierte) Skript, das ich beim Login ausgeführt habe.

Es gab zwei Dinge, die mich störten. Der erste ist, dass launchd mein Skript nicht dazu veranlasst hat, einen Unterprozess zu erzeugen, der zum Einhängen eines sshfs-Verzeichnisses erforderlich ist. Dies wurde durch Hinzufügen des folgenden Schlüsselwertpaares behoben:

<key>AbandonProcessGroup</key> <true/> 

(Danke an tw vom Forum von macworld.com )

Dank Gordons Vorschlägen konnte ich wieder Fehler auslesen /tmp/sshfs_mounts.errund feststellen, dass mit meiner Schreibweise etwas nicht stimmte. Ich habe ein paar Suchen nach sshfs-Mounts durchgeführt und auf einigen Linux-Sites Informationen gefunden, die mir beim Erstellen eines besseren Mount-Befehls geholfen haben.

Also hier ist was funktioniert.

Skript:

mount | grep /Users/jason/share if [ $? == 1 ] && [ -d /Users/jason/share ]; then /usr/local/bin/sshfs -o idmap=user jason@iss.nasa.gov:/spacedock-1 /Users/jason/share fi 

plist

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>AbandonProcessGroup</key> <true/> <key>Label</key> <string>local.sshfs.plist</string> <key>ProgramArguments</key> <array> <string>/Users/jason/Library/scripts/sshfs_mounts.sh</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist> 
Cool, ich wusste nicht, dass ich den AbandonProcessGroup-Schlüssel brauchte. Mikuz vor 8 Jahren 0