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