Executando comandos em paralelo que nunca terminam

Executando comandos em paralelo que nunca terminam

Estou tentando executar alguns comandos que nunca terminam. Esses comandos monitoram um diretório e atualizam os arquivos quando eles são alterados. A ideia é que eu precise de várias pastas monitoradas por ferramentas diferentes, capazes de rodar todas elas a partir de um único comando.

Para comandos normais que retornam conforme o esperado, separar os comandos com ;funciona.

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

Quando tento encadear comandos sem retorno (como tail -f <some_file>ou coffee -c -w <some_coffeescript_folder>, apenas o primeiro comando será executado.

Existe uma maneira de fazer isso em um único comando? Aqui estão os comandos que estou tentando 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/;

Responder1

Você pode executá-los em segundo plano adicionando um E comercial ao 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/ &

Se você quiser ver todos os trabalhos atualmente em execução em segundo plano, faça:

jobs -l

Para colocar um trabalho em segundo plano de volta em primeiro plano, use fg (o PID é opcional):

fg <PID>

Para enviar um trabalho em primeiro plano (que "bloqueia" seu shell) de volta ao modo de segundo plano, use Ctrl-Z / bg:

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

Acho que os trabalhos estão vinculados ao seu shell e não serão bifurcados automaticamente. Isso significa que se você estiver logado via SSH e se desconectar, o shell receberá um SIGHUP, que será enviado também para os jobs. Isso irá parar/sair de seus comandos.

Se você quiser manter os trabalhos em funcionamento mesmo depois de sair, você pode querer dar uma olhada no "disown" integrado do bash:

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

Outra opção é "nohup" (comando, não um bash embutido) ou você usa um multiplexador de terminal como "screen" ou "tmux".

Responder2

Experimente isto:

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/ &

informação relacionada