Ejecutar comandos en paralelo que nunca terminan

Ejecutar comandos en paralelo que nunca terminan

Estoy intentando ejecutar algunos comandos que nunca finalizan. Estos comandos vigilan un directorio y actualizan los archivos cuando cambian. La idea es que necesito varias carpetas vigiladas por diferentes herramientas, capaces de ejecutarlas todas desde un solo comando.

Para comandos normales que regresan como se esperaba, separar los comandos con ;funciona.

ls /;
cd /;
ls var;
cd var;
ls log;
cd log

Cuando intento encadenar comandos que no devuelven (como tail -f <some_file>o coffee -c -w <some_coffeescript_folder>, solo se ejecutará el primer comando.

¿Hay alguna manera de hacer esto con un solo comando? Estos son los comandos que estoy intentando vincular:

coffee -c -m -w public/javascript/*.coffee; \
stylus views/stylesheets/*.styl -w -m --out public/stylesheets/; \
stylus views/stylesheets/lib/*.styl -w -m --out public/stylesheets/lib/;

Respuesta1

Puede ejecutarlos en segundo plano agregando un signo comercial al comando:

coffee -c -m -w public/javascript/*.coffee &
stylus views/stylesheets/*.styl -w -m --out public/stylesheets/ &
stylus views/stylesheets/lib/*.styl -w -m --out public/stylesheets/lib/ &

Si desea ver todos los trabajos que se ejecutan actualmente en segundo plano, haga lo siguiente:

jobs -l

Para que un trabajo en segundo plano vuelva a estar en primer plano, utilice fg (PID es opcional):

fg <PID>

Para enviar un trabajo en primer plano (que "bloquea" su shell) nuevamente al modo en segundo plano, use Ctrl-Z / bg:

$ tail -f foobar.log # is "blocking" your shell
(hit Ctrl-Z)
$ bg

Supongo que los trabajos están vinculados a su shell y no se bifurcarán automáticamente. Esto significa que si inicia sesión a través de SSH y se desconecta, el shell recibe un SIGHUP, que también se enviará a los trabajos. Esto detendrá/saldrá de sus comandos.

Si desea mantener los trabajos en funcionamiento incluso después de cerrar la sesión, es posible que desee consultar el "disown" integrado de bash:

jobs               # fetch job ID in the squre brackets
disown -h %<JOBID> # disown job by using the job ID

Otra opción es "nohup" (comando, no un bash integrado) o utiliza un multiplexor de terminal como "screen" o "tmux".

Respuesta2

Prueba esto:

coffee -c -m -w public/javascript/*.coffee &
stylus views/stylesheets/*.styl -w -m --out public/stylesheets/ &
stylus views/stylesheets/lib/*.styl -w -m --out public/stylesheets/lib/ &

información relacionada