Executando comandos em paralelo que nunca terminam

0

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

Para comandos normais que retornam como esperado, separar os comandos com um ; funciona.

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

Quando tento encadear comandos que não retornam (como tail -f <some_file> ou coffee -c -w <some_coffeescript_folder> , somente 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/;
    
por AlbertEngelB 27.10.2014 / 21:45

2 respostas

1

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 em execução no momento, faça o seguinte:

jobs -l

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

fg <PID>

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

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

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

Se você quiser manter os trabalhos em funcionamento mesmo depois de ter feito o logout, convém olhar para o bash "disown":

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".

    
por 28.10.2014 / 08:18
1

Tente 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/ &
    
por 27.10.2014 / 21:59