Xargs com vários threads com exemplos
- 2144
- 584
- Robert Wunsch DVM
Se você é novo para Xargs
, ou não sei o que Xargs
ainda é, leia nossos Xargs para iniciantes com exemplos primeiro. Se você já está um pouco acostumado a Xargs
, e pode escrever básico Xargs
declarações de linha de comando sem olhar para o manual, este artigo ajudará você a se tornar mais avançado com Xargs
na linha de comando, especialmente tornando-a multi-thread.
Neste tutorial, você aprenderá:
- Como usar
Xargs
-P (modo multithread) da linha de comando em Bash - Exemplos de uso avançado usando multi-threaded
Xargs
Da linha de comando em Bash - Uma compreensão mais profunda de como aplicar
Xargs
Multi-thread para o seu código Bash existente
Requisitos de software e convenções usadas
Categoria | Requisitos, convenções ou versão de software usada |
---|---|
Sistema | Independente da distribuição Linux |
Programas | Linha de comando Bash, sistema baseado em Linux |
Outro | O Xargs O utilitário está incluído no shell da partida por padrão |
Convenções | # - requer que o Linux -Commands seja executado com privilégios de raiz diretamente como usuário root ou por uso de sudo comando$-exige que o Linux-Commands seja executado como um usuário não privilegiado regular |
Exemplo 1: Chamando outro shell de bash com entrada compilada de XARGS
Depois que um usa para aprender Xargs
, Ele ou ela logo descobrirá isso - enquanto Xargs
permite fazer muitas coisas poderosas por si só - o poder de Xargs
parece ser limitado por sua incapacidade de executar vários comandos em sequência.
Por exemplo, digamos que temos um diretório que tenha subdiretos nomeados 00
para 10
(11 no total). E, para cada um desses subdiretos, queremos atravessar e verificar se um arquivo nomeado arquivo.TXT
existe, e se assim for gato
(e se fundir usando >>
) o conteúdo deste arquivo em um arquivo Total_File.TXT
no diretório onde o 00
para 10
Os diretórios são. Vamos tentar fazer isso com Xargs
Em várias etapas:
$ mkdir 00 01 02 03 04 05 06 07 08 09 10 $ ls 00 01 02 03 04 05 06 07 08 09 10 $ echo 'a'> 03/arquivo.txt $ echo 'b'> 07/arquivo.txt $ echo 'c'> 10/arquivo.TXT
Aqui criamos primeiro 11 diretórios, 00
para 10
e em seguida, crie 3 amostra arquivo.TXT
arquivos nos subdiretos 03
, 07
e 10
.
$ encontre . -MaxDepth 2 -Type F -Name Arquivo.TXT ./10/arquivo.TXT ./07/arquivo.TXT ./03/arquivo.TXT
Nós então escrevemos um encontrar
comando para localizar tudo arquivo.TXT
arquivos começando no diretório atual (.
) e que até um máximo de 1 nível de subdiretos:
$ encontre . -MaxDepth 2 -Type F -Name Arquivo.txt | Xargs -i cat > ./total_file.TXT $ CAT Total_File.txt c b a
O -MaxDepth 2
indica o diretório atual (1) e Todos os subdiretos deste diretório (daí o profundidade máxima
de 2).
Finalmente usamos Xargs
(com o recomendado e preferido string de substituição, conforme passado para o XARGS
-EU
Substitua a string opção) para cat o conteúdo de qualquer arquivo localizado pelo encontrar
comando em um arquivo no diretório atual nomeado Total_File.TXT
.
Algo bom notar aqui é que, mesmo que se pensasse em Xargs
como posteriormente executando múltiplos gato
comandos todos redirecionando para o mesmo arquivo, pode -se usar >
(saída para novo arquivo, criando o arquivo se ainda não existir e substituir qualquer arquivo com o mesmo nome já lá) em vez de >>
(anexar a um arquivo e criar o arquivo se ainda não existir)!
O exercício até agora tipo de atendeu aos nossos requisitos, mas não correspondeu exatamente ao requisito - a saber, não atravessa os subdiretos. Também não usou o >>
redirecionamento conforme especificado, embora usar isso neste caso ainda teria funcionado.
O desafio de executar vários comandos (como o específico cd
comando necessário para mudar o diretório/travessar para o subdiretório) de dentro Xargs
é que 1) eles são muito difíceis de codificar e 2) pode não ser possível codificar isso.
No entanto, há uma maneira diferente e fácil de entender para codificar isso e, depois de saber como fazer isso, você provavelmente estará usando isso em abundância. Vamos mergulhar.
$ rm total_file.TXT
Primeiro limpamos nossa saída anterior.
$ ls -d--cors = nunca [0-9] [0-9] | xargs -i echo 'cd ; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; fi 'cd 00; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; fi cd 01; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; fi cd 02; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; fi cd 03; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; fi cd 04; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; fi cd 05; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; FI CD 06; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; FI CD 07; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; fi cd 08; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; FI CD 09; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; FI CD 10; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; fi
Em seguida, formulamos um comando, desta vez usando ls
que listará todos os diretórios que correspondem ao [0-9] [0-9]
Expressão regular (leia nosso artigo Advanced Bash Regex com exemplos para obter mais informações sobre expressões regulares).
Nós também usamos Xargs
, mas desta vez (em comparação com exemplos anteriores) com um eco
comando que produzirá exatamente o que gostaríamos de fazer, mesmo que exigir mais de um ou muitos comandos. Pense nisso como um mini-script.
Nós também usamos cd
para transformar em diretórios conforme listado pelo LS -D
(apenas diretórios) comando (que como uma nota lateral é protegido pelo --cor = nunca
cláusula impedindo qualquer código de cores no ls
saída da distorção de nossos resultados) e verifique se o arquivo arquivo.TXT
está lá no subdiretório usando um Se [-R…
comando. Se existir, nós gato
o arquivo.TXT
em … /Total_File.TXT
. Note o ..
Enquanto o cd
no comando nos colocou no subdiretório!
Nós executamos isso para ver como funciona (afinal, apenas o eco
É executado; nada vai realmente acontecer). O código gerado parece ótimo. Vamos dar um passo adiante agora e realmente executar o mesmo:
$ ls -d--cors = nunca [0-9] [0-9] | xargs -i echo 'cd ; se [-r ./arquivo.TXT ]; então o arquivo de gato.txt >>… /total_file.TXT; fi '| Xargs -i Bash -C "" $ CAT total_File.txt a b c
Agora executamos o script total usando um específico (e sempre o mesmo, eu.e. você vai se encontrar escrevendo | Xargs -i Bash -C ""
com alguma regularidade) comando, que executa o que foi gerado pelo eco
precedendo: Xargs -i Bash -C ""
. Basicamente, isso está dizendo ao intérprete da batida para executar o que foi passado para ele - e isso para qualquer código gerado. Muito poderoso!
Exemplo 2: Xargs multithread
Aqui vamos dar uma olhada em dois diferentes Xargs
comandos, um executado sem execução paralelo (multithread), o outro com. Considere a diferença entre os dois exemplos a seguir:
$ tempo para i em $ (seq 1 5); ECHO $ [$ Random % 5 + 1]; feito | xargs -i echo "Sleep ; echo 'feito! '"| Xargs -i Bash -c" "feito! 5 feito! 5 feito! 2 feito! 4 feito! 1 Real 0M17.016S Usuário 0M0.017S SYS 0M0.003s
$ tempo para i em $ (seq 1 5); ECHO $ [$ Random % 5 + 1]; feito | xargs -i echo "Sleep ; echo 'feito! '"| xargs -p5 -i Bash -c" "feito! 1 feito! 3 feito! 3 feito! 3 feito! 5 Real 0m5.019S Usuário 0M0.036S SYS 0M0.015s
A diferença entre as duas linhas de comando reais é pequena; Nós apenas adicionamos -P5
Na linha de segundo comando. O tempo de execução, no entanto (conforme medido pelo tempo
prefixo de comando) é significativo. Vamos descobrir o porquê (e por que a saída difere!).
No primeiro exemplo, criamos um para
loop que será executado 5 vezes (devido à sub -Shell $ (seq 1 5)
gerando números de 1
para 5
) e nele ecoarmos um número aleatório entre 1 e 5. Em seguida, muito alinhado com o último exemplo, enviamos essa saída para o comando do sono e também a duração dormiu como parte do feito! eco
. Finalmente, enviamos isso para ser administrado por um comando subshell bash, novamente de maneira semelhante ao nosso último exemplo.
A saída do primeiro comando funciona assim; executar um sono, resultado de saída, executar o próximo sono e assim por diante.
O segundo comando, no entanto, muda completamente isso. Aqui adicionamos -P5
que basicamente inicia 5 fios paralelos de uma só vez!
A maneira como esse comando funciona é: Inicie os threads X (conforme definido pela opção -p) e processe -os simultaneamente. Quando um tópico estiver concluído, pegue nova entrada imediatamente, não espere que outros threads terminem primeiro. A última parte dessa descrição não é aplicável aqui (só seria se houvesse menos tópicos especificados por -P
Em seguida, o número de 'linhas' de entrada dada ou, em outras palavras.
O resultado é que os threads que terminam primeiro - aqueles com um curto tempo de sono aleatório - voltam primeiro e produzem seu 'feito!' declaração. O tempo de execução total também cai de cerca de 17 segundos para apenas 5 segundos exatamente na hora real do relógio. Legal!
Conclusão
Usando Xargs
é uma das maneiras mais avançadas e também uma das maneiras mais poderosas de codificar em Bash. Mas não para apenas usar Xargs
! Neste artigo, assim exploramos a execução paralela multithread via -P
opção para Xargs
. Também olhamos para ligar para subshells usando $ ()
e finalmente introduzimos um método para passar declarações de vários comando diretamente para Xargs
usando a Bash -C
Sub -Shell Call.
Poderoso? Nós pensamos assim! Deixe -nos seus pensamentos.
Tutoriais do Linux relacionados:
- Exemplos sobre como usar o comando XARGS no Linux
- Multi-thread Bash Script e Gerenciamento de Processos no…
- Xargs para iniciantes com exemplos
- Mastering Bash Script Loops
- Como usar as sub -mais de bases dentro das declarações if if
- Comandos básicos do Linux
- Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
- Comandos Linux: os 20 comandos mais importantes que você precisa para…
- Sistema Linux Hung? Como escapar para a linha de comando e…
- Coisas para instalar no Ubuntu 20.04