Xargs com vários threads com exemplos

Xargs com vários threads com exemplos

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
Xargs com vários threads com exemplos

Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
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