Estou executando openssl dhparam -out dhparam4096.pem 4096
e fixa um único núcleo em 100% durante a tarefa (o que pode ser considerável em alguns processadores). Tenho 1 ou mais núcleos adicionais que estão essencialmente ociosos e gostaria de usá-los.
Eu gostaria de executar $(nproc)
× instâncias desse comando. A diferença é que não preciso de todas as instâncias para concluir - apenas aquela que sai primeiro 0
... os processos restantes devem ser SIGTERM
'd ou similares assim que a instância 'vencedora' for concluída, não precisa ser elegante.
Estou aprendendo parallel
e xargs
, para conseguir isso, existem vários artigos de instruções para concluir todas as tarefas paralelas, mas estou ficando aquém do motor de busca fu para alcançar o acima. Não sou casado com a ideia de usar parallel
ou xargs
, tenho a página de alternativas paralelas na minha lista de leitura depois de encontrar meu caminho com ela.
Como posso executar $(nproc)
× instâncias de um comando em que a primeira instância a sair 0
matará as outras instâncias?
Outras informações: Debian 11, aarch64, bash
.
No prompt de um
zsh
shell interativo:Executaria esse subshell em um novo grupo de processos, a primeira instância de
your-command
para sair aciona com sucesso umkill 0
que mata esse grupo de processos.Você pode fazer o mesmo com o
parallel
frommoreutils
com:(
{1..5}
, é do zsh e é suportado por muitos outros shells hoje em dia até o bash, mas no bash você não pode usar uma expansão lá, você sempre pode substituir por$(seq "$(nproc)")
lá assumindo um não modificado$IFS
).Ou com GNU
xargs
:Ou vinculando explicitamente cada trabalho a cada CPU:
A chave de cada vez é executá-lo no prompt de um shell interativo para que todos os comandos sejam colocados em um grupo de processos próprio.