echo 'echo "hello, world!";sleep 3;' | parallel
Este comando não gera nada até que seja concluído. Reivindicações da página de manual do Parallel:
O paralelo GNU garante que a saída dos comandos seja a mesma que você obteria se executasse os comandos sequencialmente.
Acho que o diabo está na frase: você obtém a mesma saída como se fosse executá-lo normalmente, mas não a mesma saída como se fosse executá-lo normalmente. Procurei uma opção que fizesse isso, por exemplo --results /dev/stdout
, mas não funcionou.
Meu caso de uso está vendo a saída de progresso em tempo real do comando que estou executando. Não é sobre quantas tarefas foram concluídas, qual paralelo pode ser exibido para mim, mas sobre a saída de progresso de cada comando individualmente que desejo ver.
Eu usaria um loop bash ( for i in $x; do cmd & done;
), mas quero poder interromper todas as tarefas com um único Ctrl+C, que o paralelo me permite fazer.
É possível fazer isso em paralelo? Se não, existe outra ferramenta?
Acho que você está procurando
--ungroup
. A página de manual diz:-u
claro que é sinônimo de--ungroup
.Para observar o progresso de alguns trabalhos paralelos, tente
--tmuxpane --fg
:Você também pode estar procurando por
-u
ou (mais provavelmente)--lb
. Deman parallel
:[...]
Um exemplo onde
-u
shines é onde stdout e stderr são misturados na mesma linha:Isso será formatado incorretamente com
--lb
e--group
.Mas even
-u
não garante que será formatado corretamente devido à mistura de meia linha entre os processos: http://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-PMinha solução foi registrar a saída em arquivos e observá-la mudar em tempo real com o
tail -f <file>
comando e, em seguida, excluí-los automaticamente quando o trabalho for concluído. Também achei--progress
flag útil.Aqui, os trabalhos consistirão em executar
program
com diferentes entradasA
,B
eC
enviar a saída do programa para os arquivos de log correspondentes.