Esegui script bash al login memorizzato nella cartella principale?


19

Quando provo a caricare un plist LaunchAgent da launchctlnon riesco a scoprire come eseguire uno script nella directory home.

Il mio codice è:

<?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>ProgramArguments</key>
    <array>
        <string>bash</string>
        <string>~/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

Ho provato sia con che senza bash e anche la sostituzione ~con $HOME. Ho anche provato a usarlo bash -csenza farlo funzionare.

Il codice di errore è:

`com.tyilo.test: bash: ~/script.sh: No such file or directory`

Prova a inserire il percorso completo, ad es. /Users/name/script.sh (anche io renderei lo script eseguibile e con la prima riga #! / Bin / bash ed eseguirlo direttamente)
user151019

Non riesco a utilizzare il percorso completo in quanto deve essere utilizzato su più account e computer.
Tyilo,

1
Se deve essere usato i miei account multipli, dovresti metterlo in / usr / local / bin / invece di fare più copie di esso in $ HOME di ciascun utente. Sarebbe utile sapere cosa stai cercando di realizzare con questo script. Sembra un lavoro per un LoginHook, IMO.
TJ Luoma,

Risposte:


14

EnableGlobbingconsente l'espansione tilde e jolly per ProgramArguments:

<key>EnableGlobbing</key>
<true/>
<key>ProgramArguments</key>
<array>
    <string>say</string>
    <string>~/*</string>
</array>

Non influisce Programo WatchPaths, comunque, l'espansione tilde funziona WatchPathsdi default.


Questo è il modo migliore per farlo. Esiste un luogo in cui è possibile visualizzare la documentazione per le chiavi in ​​un plist LaunchAgent?
Tyilo

man launchd.plist. Oppure vedi questo post sul blog o il mio sito Web .
Lri

1
Anche questo mi ha aiutato. Ho provato nelle seguenti versioni di Mac OS X: 10.7, 10.8 e 10.9.
Dj S

6
Nota: questa funzione è stata rimossa in Yosemite ( Mac OS X 10.10+).
alex grey,

Sembra che non sia neanche nel
10.9.5

18

EnableGlobbing non funziona su OS X Yosemite 10.10 . È stato deprecato ( rif ).

Puoi vedere nei log The EnableGlobbing key is no longer respected. Please remove it.(da /var/log/system.log)

Il problema è che launchdcwd (directory di lavoro corrente) lo è /, quindi non puoi usarlo ./come hanno detto alcune persone.

Per eseguire uno script da casa tua il modo semplice è usare (bash|zsh|sh) -c. opzione. In questo modo avrai la possibilità di usare la tilde ~o la $HOMEvariabile.

<?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>Label</key>
    <string>org.your.stuff</string>
    <key>ProgramArguments</key>
    <array>
      <!-- here is the important thing -->
      <string>zsh</string>
      <string>-c</string>
      <string>~/you/script/in/your/home</string>
    </array>

    <!-- code below is just for the example -->
    <!-- Keep running... -->
    <key>KeepAlive</key>
    <true />
    <!-- ...every day. In sec, 60*60*24 = every day -->
    <key>ThrottleInterval</key>
    <integer>86400</integer>
  </dict>
</plist>

2
Non credo che tu possa usare tilde con sh; quando Bash è coinvolto come sh, viene eseguito in modalità compatibilità POSIX, che disabilita molte estensioni Bash.
Tripleee,

~/sta divorando, quindi non supportato. È possibile utilizzare ./invece fino a quando il demone viene salvato nella libreria home degli utenti. ( ~/Library/LaunchAgents)
Bruno,

9

Il più affidabile che ho trovato nel fare questo è stato usando she la HOMEvariabile di ambiente:

<?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>ProgramArguments</key>
    <array>
        <string>sh</string>
        <string>-c</string>
        <string>"$HOME/script.sh"</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

Nota: le virgolette sono obbligatorie.


2

Sarebbe utile sapere perché lo script deve essere eseguito dalla home directory dell'utente. Se hai bisogno del nome breve dell'utente per lo script, puoi ottenerlo assegnandolo a una variabile come in

user=`whoami`

Quindi utilizzare $usernello script.

Vorrei davvero mettere lo script in un posto diverso da una home directory, quindi è accessibile da altri utenti sullo stesso computer. È possibile utilizzare la directory condivisa o inserire lo script in / Libreria / Script /

Dovrai utilizzare il percorso completo per il plist di avvio. Inoltre, nel tuo plist di lancio non dovrai specificare <string>bash</string>come dovresti avere lo shebang nello script e dovrebbe essere eseguibile.


Specificare bashcome il comando effettivamente da eseguire è un buon fallback senza alcun danno reale. Se non ha lo shebang o si dimentica di rendere eseguibile lo script (o = rwx), bash invocherà / eseguirà comunque lo script.
Jason Salaz,

1
Dovrebbe esserci già una variabile per il nome utente, come $ USER o $ LOGNAME. Inoltre, la solita posizione per gli script Unix condivisi sarebbe / usr / local / bin / (non che non potresti metterli altrove, ma molto probabilmente / usr / local / bin / sarà già nel tuo $ PATH).
TJ Luoma,

L'uso di whoami è solo un altro metodo per ottenere le stesse informazioni di $ USER o $ LOGNAME. Ho suggerito le posizioni sopra perché non volevo presumere nulla dell'interrogante. Inoltre, prima di provare a far funzionare il plist di avvio, lo script deve effettivamente essere eseguito dalla CLI.
Afragen,

1

È eseguibile?

chmod 700 ~/script.sh

nel terminal. Inoltre, non userei $ HOME o ~ ma piuttosto il percorso effettivo del file.

<?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>Label</key>
    <string>com.tyilo.test</string>
    <key>ProgramArguments</key>
    <array>
        <string>/path/to/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Qual è la ragione del downvote?
TJ Luoma,

1

Se lo script è un programma utente (e quindi si trova nella libreria della cartella Home), launchdl'attuale directory di lavoro è la cartella Home. UNIX fa riferimento alla home directory con un punto nel percorso.

Quindi in pratica, usa ./script.shinvece di ~/script.sh. ;-)


3
No, la directory di lavoro di launchd è in realtà /, non '~'.
Tyilo

@Tyilo Non sono sicuro di cosa intendi. Se intendi "la directory di lavoro di launchd è la radice, in tutti i casi, anche in modalità utente", fornisci un riferimento. Se vuoi dire "launchd usa una barra anziché una tilde", leggi di nuovo il mio post. A proposito, ho diversi script programmati in launchd e seguono il comportamento che descrivo. ;-)
Constantino Tsarouhas

1
@RandyMarch Ho fatto un agente di lancio ~/Library/LaunchAgentscon gli argomenti: sh, -c, echo $HOME > /Users/Tyilo/launchd_home.txt. Quando è stato eseguito il file /Users/Tyilo/launchd_home.txtcontenuto /, no /Users/Tyilo.
Tyilo
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.