Befehl beim Starten / Anmelden ausführen (Mac OS X)

51

Ich habe mich gefragt, in welcher Datei ich diesen Bash-Befehl ablegen soll, damit er beim Start ausgeführt wird.

# Start the MongoDB server
/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log

Ich habe Scheuern im Netz und denke , es ist zwischen ~/.bashrc, ~/profile, /etc/bashrc, /etc/profileoder ~/.bash_profile. Obwohl ich diese ausprobiert habe und sie beim Terminal-Start zu laufen scheinen, nicht beim Mac-Start . Vermisse ich eine Datei?

Wolfy87
quelle

Antworten:

33

Offiziell keines davon. Der von Apple vorgeschlagene Weg ist die Verwendung von launchd . Guis, um dies einzurichten, gehören Lingon und Launch Control

Was die Dateien anbelangt, die Sie im Home-Verzeichnis ~ / .bashrc, ~ / profile, ~ / .bash_profile erwähnen, werden sie nur gestartet, wenn Sie sich über ein Terminal anmelden. Die Dateien in / etc werden von der Shell für alle Benutzer ausgeführt, die sich vor den Dateien im Basisverzeichnis befinden, jedoch nur, wenn eine Benutzeranmeldung erfolgt .. bash manual

Das Unix-Startskript umfasste / etc / rc *, aber für OSX verwenden Sie einfach das launchd-Zeug

Kennzeichen
quelle
1
Wenn also mein Befehl in eine der darin enthaltenen Dateien eingefügt wird /etc, sollte er beim Booten ausgeführt werden? Ist es wichtig, in welcher?
Wolfy87
1
/etc/bashrcund so weiter werden ausgeführt, wenn Sie eine Shell starten, genau wie ~/.bashrc- es ist nur so, dass die erstere ausgeführt wird, wenn ein Benutzer eine Shell startet, und nicht nur Ihr Benutzer.
Scott
@ Scott ist richtig Ich habe meine Antwort korrigiert
Mark
4
Okay, aber ich kann nicht herausfinden, wie ich launchd verwende. Ich habe versucht, eine plist-Datei für mein Programm zu erstellen, aber ich habe keine Ahnung, wie ich es ausführen soll oder wie ich es beim Booten zum Laufen bringen soll.
Wolfy87
1
@ Mark Link zu "launchd" ist kaputt :(
Artem
58

Um einen Befehl beim Start unter OS X auszuführen, müssen Sie verwenden launchd.

Wenn Sie Lingon nicht verwenden möchten , müssen Sie eine launchdEigenschaftsliste erstellen . Da es sich um eine XML-Datei handelt, können Sie sie mit Ihrem bevorzugten Texteditor ausführen oder den Eigenschaftenlisten-Editor verwenden, der mit den Mac OS X-Entwicklungstools installiert wurde. Erstellen Sie Folgendes:

<?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>some.meaningful.name</string> <!-- org.mongodb.mongodb perhaps? -->

    <key>OnDemand</key>
    <false/>

    <key>UserName</key>
    <string>anAppropriateUser</string>

    <key>GroupName</key>
    <string>anAppropriateGroup</string>

    <key>ProgramArguments</key>
    <array>
            <string>/Applications/MongoDB/bin/mongod</string>
            <string>--dbpath</string>
            <string>/usr/local/mongo/data</string>
            <string>--fork</string>
            <string>--logpath</string>
            <string>/usr/local/mongo/log</string>
    </array>
</dict>
</plist>

Speichern Sie dies in /Library/LaunchAgents/some.meaningful.name.plist(Sie benötigen ein Administratorkonto und / oder sudo), öffnen Sie dann ein Terminal und führen Sie Folgendes aus:

sudo launchctl load /Library/LaunchAgents/some.meaningful.name.plist

Dies bewirkt, dass launchd das Element lädt, wodurch MongoDB beim Booten gestartet wird. Als Bonus launchdwird es überwacht und, falls es aus irgendeinem Grund beendet wird, neu gestartet. Um den Gegenstand loszuwerden, ersetzen Sie einfach load im obigen Befehl durch unload.

Scott
quelle
1
Diese Seite ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ) enthält eine Reihe von Dingen, die von launchd nicht ausgeführt werden sollten. Wenn ich beim Start einen beliebigen Befehl ausführen möchte, kann es sein, dass ich nicht die Kontrolle darüber habe und der Befehl diese Dinge erledigt. Außerdem möchte ich möglicherweise nicht, dass launchd neu gestartet wird und das Element stoppt, da es sich um eine einmalige Aktion handelt oder den Neustart von sich aus erledigt. Was soll ich in diesen Fällen tun?
Michael
@ Scott, danke. Dies ist die hilfreichste Antwort, die ich im Internet gefunden habe.
Dmitriy
5
Dadurch wird versucht, die Anwendung alle 10 Sekunden auszuführen, was für Dienste, die nicht abstürzen, gut funktioniert. Wenn dies für ein Skript gilt, das einmal pünktlich ausgeführt wird (in meinem Fall Messaging einmal Slack beim Neustart), ergänzen Sie <key>LaunchOnlyOnce</key><true/>das Diktat.
msanford
Großartiger Punkt, Mr. Sanford. launchd, das nicht aufgibt, erstellt riesige Protokolldateien, die Ihren Mac verlangsamen (da so große Protokolldateien ständig gelesen und geschrieben werden). Ich verwende dieses Update möglicherweise auf einigen schlecht geschriebenen kommerziellen Programmen, die derzeit auf meinem Computer ausgeführt werden.
Foliovision
1
Hinweis für sich selbst: Wenn Sie Umgebungsvariablen benötigen: serverfault.com/questions/111391/…
Quandary
47

Eine weitere einfache Lösung von Stack Overflow : Sie können:

  • Starten Sie Automator.app.
  • Wählen Sie "Anwendung";
  • Klicken Sie in der Symbolleiste auf "Bibliothek anzeigen" (falls ausgeblendet).
  • Fügen Sie "Shell-Skript ausführen" hinzu (über Aktionen / Dienstprogramme).
  • Kopieren Sie Ihr Skript und fügen Sie es in das Fenster ein.
  • Probier es aus;
  • Speichern Sie es irgendwo: eine Datei mit dem Namen your_name.appwird erstellt);
  • Abhängig von Ihrer MacOSX-Version:
    • Alte Versionen: Gehen Sie zu Systemeinstellungen → Konten → Anmeldeelemente oder
    • Neue Version: Gehen Sie zu Systemeinstellungen → Benutzer und Gruppen → Anmeldeelemente (oben rechts).
  • Fügen Sie diese neu erstellte App hinzu.

Melden Sie sich ab, melden Sie sich wieder an, und Sie sollten fertig sein. ;)

Jaime M.
quelle
2
Getestet und funktioniert und es ist weder eine umständliche Bearbeitung der Liste noch eine kostenpflichtige Lingon-App erforderlich.
Lukasz
4
Es fügt Ihrem dreizeiligen Shellscript jedoch ungefähr 1804k Boilerplate hinzu!
android.weasel
1
Vielen Dank für die ausführlichen Anweisungen, wie Sie mit Automator etwas Nützliches machen können. Das hilft mir nicht nur bei der einen Aufgabe. Vielen Dank, Jaime. Ich benutze es, um Turbo Boost über Turbo Boost Switcher auszuschalten. Ich besitze die kostenpflichtige Version, aber die Lizenzierungsmechanismen sind schrecklich genug. Ich bevorzuge die kostenlose Version, für die der Start über das Terminal erforderlich ist, um die Aufforderung zur Eingabe eines Administratorkennworts bei jedem Wake-from-Sleep-Vorgang zu vermeiden.
Foliovision
1
@ android.weasel Siehe Geekarist Antwort superuser.com/a/995564/255375
JD
Superuse-ful :-D, +1
Mukul Goel
27

So starten Sie Befehle beim Anmelden:

  • Erstellen Sie eine Textdatei mit Ihren Befehlen (Bash-Skript):

    #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
  • Speichern Sie diese Datei in ~/Library/Startup.cmd

  • Sie können es testen, indem Sie im Finder auf die Datei doppelklicken
  • Mach es ausführbar: chmod +x ~/Library/Startup.cmd
  • Fügen Sie diese Datei unter Systemeinstellungen> Konten> Anmeldeelemente hinzu
Geekarist
quelle
3
beste und einfachste antwort imho. viel einfacher als akzeptierte Lösung. Beachten Sie, dass es in den Systemeinstellungen> Benutzer und Gruppen> Anmeldeelemente ... (nicht Konten) ist. Beachten Sie auch, dass die Datei überall sein kann und nicht mit .cmd enden muss. einfach chmod + x it.
Foreyez
5
Anmeldeelemente werden jedoch beim Anmelden und nicht beim Systemstart ausgeführt. Wenn Sie einen Server betreiben, ist das ein großer Unterschied.
Not2savvy
Du hast recht @ not2savvy. Für einen Server würde ich @ Sridhar-Sarnobats Antwort mit empfehlen @reboot. Wie auch immer meine Antwort es erlauben würde, ein grafisches Programm zu starten, deshalb halte ich es für nützlich.
Geekarist
Warum endet mit cmdstatt sh?
Simin Jie
3

Sie müssen sich ansehen, wie launchdund wie Sie launchctlunter MacOS arbeiten. Sie könnten damit beginnen, die Manpages für beide Befehle zu lesen. Sie können dann nachschauen /Library/LaunchAgents/und /Library/LaunchDaemons/nach Beispielen suchen, wie Sie Anwendungen so einrichten, dass sie zu unterschiedlichen Zeiten über die launchctlBenutzeroberfläche geladen werden.

Hier ist ein Beispiel, das ich bei Stack Overflow gefunden habe und das Ihnen weiterhelfen könnte.

Ayaz
quelle
0

Ich war an einer sehr einfachen Unix-Antwort auf dieses Problem interessiert und fand sie an einer anderen Stelle . Hier ist eine Zusammenfassung der Lösung.

Der Standard für Login-Shells ist, immer nach den Bash-Konfigurationsdateien mit dem Namen "profile" in der folgenden Reihenfolge zu suchen: / etc / profile, ~ / .bash_profile, dann ~ / .bash_login und zuletzt ~ / .profile. Wenn Login-Shells beendet werden, lesen sie ~ / .bash_logout.

In meinem Fall habe ich gerade das ~ / .bash_profile erstellt und dann die Einstellungen für die Mac-Terminal-App geöffnet und die Option "Shell wird geöffnet mit" von "Standard" in "/ bin / bash" geändert. Das ist es. Sauber und einfach.

markgp
quelle
-3

offenes Terminal, Typ

nano ~/.bash_profile

Fügen Sie dann diesen Text zur Datei hinzu:

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log
Max
quelle
3
Dies setzt voraus, dass Sie nach dem Anmelden ein Terminalfenster öffnen.
Arjan