Esecuzione di script al login mac [chiuso]


280

Mi chiedo se qualcuno è in grado di aiutarmi a ottenere un file .sh da eseguire quando accedo al mio account sul mio computer. Sto eseguendo Mac OS X 10.6.7.

Ho un file "Esempio.sh" che voglio eseguire quando accedo al mio computer. Non ho problemi a eseguirlo quando ho già effettuato l'accesso, ma voglio che questo avvenga automaticamente.

La gente dice di aggiungerlo al file della shell di login, ma non so dove sia. Qualche aiuto per favore.


3
Questo non è fuori tema ... Ne avevo bisogno per avviare il mio demone Emacs;) A proposito, la migliore risposta è IMHO sull'app Lingon X.
HappyFace,

1
Non mi interessa se questo è fuori tema. È la migliore risposta che ho trovato su Internet e merita rispetto. L'ho ignorato per gli altri la prima volta che ho cercato una soluzione ed è stato un grosso errore!
Sethmr

Risposte:


379

Segui questo:

  • inizio Automator.app
  • Selezionare Application
  • fai clic Show librarysulla barra degli strumenti (se nascosta)
  • aggiungi Run shell script(dal Actions/Utilities)
  • copia e incolla il tuo script nella finestra
  • Provalo
  • salva da qualche parte (ad esempio puoi creare una Applicationscartella nella tua HOME, otterrai un your_name.app)

  • vai a System Preferences-> Accounts->Login items

  • aggiungi questa app
  • test & done;)

MODIFICARE:

Recentemente ho guadagnato un badge "Buona risposta" per questa risposta. Mentre la mia soluzione è semplice e funzionante, il modo più pulito per eseguire qualsiasi programma o script di shell al momento dell'accesso è descritto nella risposta di @ trisweb , a meno che tu non voglia l'interattività .

Con la soluzione di automazione puoi fare cose come la prossima: applicazione di login screenshot di automator

quindi, chiedendo di eseguire uno script o chiudere l'app, chiedere password, eseguire altri flussi di lavoro dell'automatore al momento dell'accesso, eseguire in modo condizionale applicazioni al momento dell'accesso e così via ...


2
@GregMiernicki LOL, buongiorno ...;) Quasi un anno fa ho aggiunto un EDIT alla mia risposta, dove lo dicevo anche io. Ma questo è un po 'più semplice per gli utenti medi, poiché la creazione di file XML (plist) non è molto intuitiva per molti utenti. Comunque - grazie per un commento. ;)
jm666

4
@GregMiernicki e non dimenticare, con la soluzione Automator puoi creare script di login INTERATTIVI - ad esempio uno script che ti chiederà una voce (ad esempio password aggiuntiva o qualcosa di simile). Il mondo non è solo bianco o nero , almeno è come una zebra ... :) :)
jm666

2
@Cupidvogel L'esecuzione di un demone al momento dell'accesso è esattamente il lavoro per la soluzione launchd - vedere la risposta di trisweb. Se riesci a gestire un demone Python, sei sicuro di poter gestire un file di configurazione plist in cui puoi gestire tutti gli aspetti dei riavvii e così via ...
jm666

3
Complimenti per aver indicato l'altra risposta come la più pulita. Quello dovrebbe ottenere un buon distintivo di cittadinanza :).
Studgeek

2
Risposta incredibile. Esporta PATH = / usr / local / bin: $ PATH, all'inizio dello script, se vuoi eseguire comandi come "aggiornamento globale del compositore" all'avvio del sistema.
Leonardo,

377

tl; dr: processo nativo launcher e responsabile uso di OSX, launchd.

Per fare ciò, crea un launchctldemone. Avrai il pieno controllo di tutti gli aspetti dello script. Puoi correre una volta o tenerlo in vita come demone. Nella maggior parte dei casi, questa è la strada da percorrere.

  1. Crea un .plistfile in base alle istruzioni nei documenti Apple Dev qui o più in dettaglio di seguito.
  2. Posizionare in ~/Library/LaunchAgents
  3. Accedi (o esegui manualmente tramite launchctl load [filename.plist])

Per di più launchd, l'articolo di Wikipedia è abbastanza buono e descrive il sistema e i suoi vantaggi rispetto ad altri sistemi più vecchi.


Ecco il file plist specifico per eseguire uno script all'accesso .

Aggiornato il 25/09/2017 per OSX El Capitan e versioni successive (credito a José Messias Jr ):

<?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.user.loginscript</string>
   <key>ProgramArguments</key>
   <array><string>/path/to/executable/script.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

Sostituisci il <string>tasto Program dopo con il comando desiderato (nota che qualsiasi script a cui fa riferimento quel comando deve essere eseguibile: chmod a+x /path/to/executable/script.shper essere sicuro che sia per tutti gli utenti).

Salva come ~/Library/LaunchAgents/com.user.loginscript.plist

Esegui launchctl load ~/Library/LaunchAgents/com.user.loginscript.pliste disconnetti / accedi per testare (o per testare direttamente, esegui launchctl start com.user.loginscript)

Coda /var/log/system.logper i messaggi di errore.

La chiave è che si tratta di una voce launchd specifica dell'utente, quindi verrà eseguita all'accesso per l'utente specificato. I daemon di avvio specifici del sistema (inseriti /Library/LaunchDaemons) vengono eseguiti all'avvio.

Se vuoi che uno script venga eseguito all'accesso per tutti gli utenti, credo che LoginHook sia la tua unica opzione, e questo è probabilmente il motivo per cui esiste.


4
Sì. FWIW Ho trovato utile questo blog sulla stessa tecnica: developernotes.com/archive/2011/04/06/169.aspx
Daniel James

8
Trascuri di menzionare ciò che è dubbio sulle azioni di Automator e perché non sono "raccomandate".
Mike Campbell,

4
Ecco una buona panoramica delle azioni delle cartelle rispetto a launchctl: apple.stackexchange.com/a/63731/38290 - E un'altra su una delle limitazioni di LoginHook (è consentito solo uno script) - superuser.com/a/377401 . Non è davvero un metodo discutibile o scarso, ma launchctlnella maggior parte dei casi è semplicemente molto meglio e ti dà un maggiore controllo su tutti i possibili aspetti dell'esecuzione del tuo script. È più nel senso di "perché usare un metodo meno capace quando esiste launchd?" (Nota che ho cambiato la prima frase per indicare che personalmente non le consiglio per questa situazione).
trisweb,

3
Ti chiedi come creare LaunchDaemon per sapere cosa verrà eseguito ogni volta che l'utente accede? . Quindi, non all'avvio del sistema, ma ogni volta che l'utente accede (provare con il ciclo logout-login). Potete per favore mostrare esattamente (e non solo bla-bla) come implementare la soluzione di automazione di cui sopra (per sbaglio) con launchctl?
Cajwine,

9
Plist file in / Library / LaunchAgents / vengono eseguiti all'accesso con l'id dell'utente che ha effettuato l'accesso. Plist file in / Library / LaunchDaemons / vengono eseguiti all'avvio come root (l'id può essere modificato con il tasto Utente ).
Guadagna il

42
  1. Crea il tuo script shell come login.shnella tua cartella $ HOME.

  2. Incolla il seguente script di una riga in Script Editor:

    eseguire lo script di shell "$ HOME / login.sh"

  3. Quindi salvalo come un'applicazione.

  4. Infine aggiungi l'applicazione ai tuoi elementi di accesso.

Se si desidera rendere visibile l'output dello script, è possibile scambiare il passaggio 2 per questo:

tell application "Terminal"
  activate
  do script "$HOME/login.sh"
end tell

Se sono necessari più comandi, è possibile utilizzare qualcosa del genere:

tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell

1
Ho collegato questo, l'unica cosa che manca un programma di installazione da riga di comando;)
sorin

1
Bella soluzione. Come posso nascondere la finestra "login"? Ho provato a selezionare gli elementi di accesso.
xgdgsc,

1
@xgdgsc: vai a Go to System Preferences -> Accounts -> Login itemse seleziona la casella nascondi per questa applicazione.
Anubhava,

1
@anubhava Come ho già detto, ho già selezionato la casella nascosta per questa applicazione di accesso. Ma sembra ancora e deve essere costretto a chiudere quando si spegne il computer.
xgdgsc,

2
@xgdgsc: Oh ok, hai controllato la ~/Library/LaunchAgentscartella?
anubhava,
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.