0 votos

Cómo empezar con launchd un bash script que llama a fswatch con `&`

Manualmente funciona

Tengo un script de bash llamado git-watch.sh (gist enlace) que llama a fswatch en un bucle como este:

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

(Nota de la ampersand. Tuve que usar porque fswatch bloques de espera para el cambio, por lo que el while no pasar de la primera iteración de otra manera. Podría estar interfiriendo con launchd , aunque, no estoy seguro.)

Funciona bien si me llaman desde la línea de comandos pasar un archivo, como

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

Ejecución ps aux | grep fswatch rendimientos:

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

Que es lo que queremos.


Launchd no

Pero ahora quiero que se inicie automáticamente en el inicio de sesión, y no he sido capaz de conseguir launchd a cooperar.

Aquí está mi com.user.gitWatchMyPathsOnLogin.plist hasta el momento:

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

Carga sin error. Se inicia sin producir nada a stderr o stdout, pero aquí es lo ps aux | grep fswatch me da:

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

Se ejecuta fswatch sólo con la última línea en la git-watch-paths.txt archivo. ( fswatch Para dotfiles falta.)

Y no auto-commit cuando sucede un cambio, así que supongo que las partes fswatch se canaliza a no recibir llamadas.


¿Qué estoy haciendo mal, o cómo podría yo depuración de esto, aún más, cuando launchd no tirar ningún error o la salida de cualquier cosa?

1voto

thrig Puntos 101

¿Qué sucede si usted enmendar git-watch.sh el uso de la "espera" de comandos para esperar a que los procesos en segundo plano?

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

wait

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X