Come iniziare con launchd uno script bash che chiama fswatch con '&'

0

Funziona manualmente

Ho uno script di bash chiamato git-watch.sh (collegamento di prova) che chiama fswatch in un ciclo come questo:

while read -r line; do
  {
    fswatch -r "$line" | grep --line-buffered -v '.git' | xargs -n1 -I{} git-commit-unattended.sh "$line";
  } &
done

(Nota ampersand . Dovevo usarlo perché fswatch blocca in attesa di modifica, quindi while non supererebbe la prima iterazione altrimenti potrebbe interferire con launchd , non certo.)

Funziona bene se lo chiamo dalla riga di comando passandogli un file, come

git-watch.sh < /Users/kbdluv/Dropbox/dotfiles/git-watch-paths.txt

Percentuale di rendimento di ps aux | grep fswatch :

kbdluv           9629   0.0  0.0  4278008    920 s001  S+    5:46PM   0:00.00 grep fswatch
kbdluv           9415   0.0  0.0  4299876   4912 s001  S     5:37PM   0:00.01 fswatch -r /Users/kbdluv/Dropbox/org
kbdluv           9414   0.0  0.0  4315736   4944 s001  S     5:37PM   0:00.01 fswatch -r /Users/kbdluv/Dropbox/dotfiles

Che è ciò che vogliamo.

Launchd non fa

Ma ora voglio che si avvii automaticamente all'accesso e non sono stato in grado di ottenere launchd per cooperare.

Ecco il mio com.user.gitWatchMyPathsOnLogin.plist finora :

<?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.gitWatchMyPathsOnLogin</string>
   <key>ProgramArguments</key>
   <array><string>/Users/kbdluv/Dropbox/dotfiles/scripts/git-watch-my-paths-on-login.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
   <key>StandardOutPath</key>
   <string>/tmp/com.user.gitWatchMyPathsOnLogin.out</string>
   <key>StandardErrorPath</key>
   <string>/tmp/com.user.gitWatchMyPathsOnLogin.err</string>
</dict>
</plist>

Carica senza errori. Si inizia senza emettere alcun output su stderr o stdout, ma ecco cosa mi offre ps aux | grep fswatch :

kbdluv          11550   0.0  0.0  4267768    888 s001  S+    7:56PM   0:00.00 grep fswatch
kbdluv          11545   0.0  0.0  4298088   4932   ??  S     7:56PM   0:00.01 fswatch -r /Users/kbdluv/Dropbox/org

Esegue fswatch solo con la riga ultima nel file git-watch-paths.txt . (Manca il fswatch per dotfiles .)

E non esegue il commit automatico quando si verifica una modifica, quindi suppongo che le parti fswatch in fase di piping non vengano richiamate.

Che cosa sto sbagliando, o come potrei eseguire il debug ulteriormente quando launchd non sta generando alcun errore o non sta emettendo nulla?

    
posta kbdluv 09.01.2018 - 00:04
fonte

1 risposta

1

Che cosa accade se modifichi git-watch.sh per utilizzare il comando "wait" per attendere i processi in background?

while read -r line; do
  {
    fswatch -r "$line" | grep --line-buffered -v '.git' | xargs -n1 -I{} git-commit-unattended.sh "$line";
  } &
done

wait
    
risposta data 09.01.2018 - 17:36
fonte

Leggi altre domande sui tag