Esegui comando all'avvio / accesso (Mac OS X)


53

Mi chiedevo in quale file dovrei inserire questo comando bash in modo che venga eseguito all'avvio.

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

Sono stato purga la rete e penso che sia tra ~/.bashrc, ~/profile, /etc/bashrc, /etc/profileo ~/.bash_profile. Anche se ho provato questi e sembrano funzionare all'avvio del terminale non all'avvio del Mac . Mi manca un file?

Risposte:


33

Ufficialmente nessuno di questi. Il modo suggerito da Apple è usare launchd . Guis per impostare questo includono lingon e Launch Control

Per quanto riguarda i file citati nella directory principale ~ / .bashrc, ~ / profile, ~ / .bash_profile vengono avviati solo quando si accede tramite un terminale. Quelli in / etc sono gestiti dalla shell a partire da tutti gli utenti prima di quelli nella directory home ma solo quando viene effettuato un login utente. Manuale di bash

Lo script di avvio di Unix riguardava / etc / rc * ma per OSX basta usare le cose lanciate


1
Quindi se il mio comando è inserito in uno dei file in /etcesso dovrebbe essere eseguito all'avvio? Importa in quale si trova?
Wolfy87,

1
/etc/bashrce così via vengono eseguiti quando si avvia una shell, proprio come ~/.bashrc- è solo che il primo verrà eseguito ogni volta che un utente avvia una shell, anziché solo l'utente.
Scott,

@Scott è corretto Ho corretto la mia risposta
user151019

4
Va bene, ma non riesco proprio a capire come usare launchd, ho provato a creare un file plist per il mio programma ma non ho idea di come eseguirlo o come farlo funzionare all'avvio.
Wolfy87,

1
Il link @Mark a "launchd" è interrotto :(
Artem

58

Per eseguire un comando all'avvio su OS X, è necessario utilizzare launchd.

Se non si desidera utilizzare Lingon , è necessario creare un launchdelenco di proprietà. Questo è un file XML, quindi puoi farlo con il tuo editor di testo preferito o in alternativa puoi utilizzare l'Editor elenco proprietà installato con Mac OS X Dev Tools. Creare quanto segue:

<?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>

Salvalo in /Library/LaunchAgents/some.meaningful.name.plist(avrai bisogno di un account amministratore e / o sudo), quindi apri un terminale e fai:

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

Ciò farà sì che launchd carichi l'elemento che lo farà avviare MongoDB all'avvio. Come bonus, launchdlo monitorerà e, se esce per qualsiasi motivo, verrà riavviato. Per sbarazzarsi dell'articolo basta sostituire il carico nel comando sopra con scarico.


1
Questa pagina ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ) elenca molte cose che qualcosa di lanciato da launchd non dovrebbe fare. Se voglio eseguire un comando arbitrario all'avvio, potrei non avere il controllo di e il comando potrebbe finire per fare quelle cose. Inoltre, potrei non voler riavviare launchd e l'elemento che si interrompe perché è una tantum o gestisce il riavvio da solo. Cosa devo fare in questi casi?
Michael,

@Scott, grazie. Questa è la risposta più utile che ho trovato su Internet.
Dmitriy,

5
Questo tenterà di eseguire l'applicazione ogni 10 secondi, il che funziona bene per i servizi che non muoiono. Se questo è per uno script che viene eseguito una volta puntualmente (nel mio caso, messaggistica una volta Slack al riavvio) aggiungere <key>LaunchOnlyOnce</key><true/>al dict.
msanford,

Ottimo punto signor Sanford. launchd che non si arrende crea enormi file di registro che rallentano il tuo Mac (a causa della lettura e della scrittura di file di registro così grandi continuamente). Potrei usare quella correzione su alcuni dei software commerciali scritti male sul mio computer ora.
Foliovision,

1
Nota per sé: se sono necessarie variabili di ambiente: serverfault.com/questions/111391/…
Quandary

48

Un'altra soluzione semplice da Stack Overflow : è possibile:

  • Avviare Automator.app;
  • Seleziona "Applicazione";
  • Fai clic su "Mostra libreria" nella barra degli strumenti (se nascosto);
  • Aggiungi "Esegui script shell" (da Azioni / Utilità);
  • Copia e incolla il tuo script nella finestra;
  • Provalo;
  • Salvalo da qualche parte: your_name.appverrà creato un file chiamato );
  • A seconda della versione di MacOSX:
    • Vecchie versioni: Accedere a Sistema → Preferenze → articoli Conti di login, oppure
    • Nuova versione: vai in Preferenze di Sistema → Utenti e gruppi → Elementi di accesso (in alto a destra);
  • Aggiungi questa app appena creata;

Disconnettersi, riconnettersi e si dovrebbe fare. ;)


2
Testato e funzionante e non richiede modifiche ingombranti e complicate né l'app Lingon a pagamento.
Lukasz,

4
Tuttavia, aggiunge circa 1804k di piastra di caldaia al tuo shellscript a tre righe!
android.weasel,

1
Grazie per le istruzioni dettagliate su come rendere utile qualcosa con Automator. Questo mi aiuterà non solo con l'unico compito. Grazie gentilmente Jaime. Lo sto usando per disattivare Turbo Boost tramite Turbo Boost Switcher. Possiedo la versione a pagamento, ma i meccanismi di licenza sono abbastanza orribili, preferisco usare la versione gratuita che richiede l'avvio tramite terminale per evitare richieste di password dell'amministratore ad ogni riattivazione dalla sospensione.
Foliovision,

1
@ android.weasel Vedi la risposta di Geekarist superuser.com/a/995564/255375
JD

Superuso-ful :-D, +1
Mukul Goel,

28

Per avviare i comandi durante l'accesso, è possibile effettuare questa operazione:

  • Crea un file di testo contenente i tuoi comandi (script bash):

    #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
  • Salva questo file in ~/Library/Startup.cmd

  • Puoi testarlo facendo doppio clic sul file nel Finder
  • Renderlo eseguibile: chmod +x ~/Library/Startup.cmd
  • Aggiungi questo file in Preferenze di Sistema> Account> Elementi di accesso

3
risposta migliore e più semplice imho. molto più facile della soluzione accettata. si noti che è in Preferenze di Sistema> Utenti e gruppi> Elementi di accesso ... (non Account) ... e si noti inoltre che il file può essere ovunque, non deve finire con .cmd. basta chmod + x esso.
foreyez,

5
Tuttavia, gli elementi di accesso vengono eseguiti all'accesso, non all'avvio del sistema. Se si esegue un server, questa è una grande differenza.
not2savvy,

Hai ragione @ not2savvy. Per un server consiglierei la risposta di @ Sridhar-Sarnobat con @reboot. Tuttavia la mia risposta consentirebbe di avviare un programma grafico, ecco perché penso sia utile.
Geekarist,

Perché finisce con cmdinvece di sh?
Simin Jie,

3

Dovrai vedere come launchde launchctllavorare su MacOS. Puoi iniziare leggendo le pagine man di entrambi i comandi. Potresti quindi guardare all'interno /Library/LaunchAgents/e /Library/LaunchDaemons/per esempi su come impostare applicazioni da caricare in momenti diversi attraverso l' launchctlinterfaccia.

Ecco un esempio che ho trovato su Stack Overflow che potrebbe aiutarti ulteriormente.



0

Ero interessato a una risposta unix molto semplice a questo problema e l'ho trovata su un altro sito . Ecco un riepilogo della soluzione.

Lo standard per le shell di login è cercare sempre i file di configurazione bash con "profilo" nel nome, in questo ordine: / etc / profile, ~ / .bash_profile, quindi ~ / .bash_login e infine ~ / .profile. Quando le shell di login escono, leggono ~ / .bash_logout.

Nel mio caso ho appena creato il ~ / .bash_profile e poi ho aperto le preferenze per l'app Mac Terminal e ho cambiato l'opzione "Shell si apre con" da default a / bin / bash. Questo è tutto. Pulito e semplice.


-3

terminale aperto, digitare

nano ~/.bash_profile

quindi aggiungi questo testo al file:

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log

3
Ciò presuppone che tu apra una finestra Terminale dopo aver effettuato l'accesso.
Arjan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.