evita que xargs parem de responder

21

De acordo com a página man, os xargs serão encerrados se uma das linhas de execução sair com um erro de 255:

If any invocation of the command exits with a status of 255, xargs will stop immediately without reading any further input. An error message is issued on stderr when this happens.

Como posso fazer xargs para não fazer isso?

Eu tenho um trabalho em lote de 1500 linhas que eu quero executar, 50 linhas de cada vez. Eu estava achando que estava sempre morrendo em certa linha, e não completando o trabalho. Não é bom!

Uma pergunta ainda melhor, a questão que descreve o que estou tentando fazer é:

Como posso executar um script em lote de 1500 linhas, 50 linhas de cada vez, para que ele não saia do trabalho no meio e para que a saída seja capturada em um arquivo de log de algum tipo? / em>

    
por JDS 11.07.2011 / 17:56

6 respostas

7

Você pode incluir o script perl em outro script simples:

#!/bin/bash
real-command "$@" || exit 0

Isto irá chamar comando real passando todos os parâmetros que você passa para este fake-command e sempre retornará um código de saída 0 (isso significa que é sempre bem sucedido) e xargs nunca vai parar com isso.

    
por 18.07.2011 / 10:04
15

Semelhante a larsks answer mas mais explícito:

xargs sh -c "somecommand || true"
    
por 22.01.2014 / 01:01
6

Você pode gravar sua chamada de xargs para mascarar os códigos de retorno de suas linhas de comando. Com algo como o seguinte, xargs nunca verá códigos de saída retornados por somecommand :

xargs sh -c "somecommand || :"
    
por 11.07.2011 / 18:08
3

Apenas encontrei uma resposta divertida para essa, embora sua utilidade dependa do comando que você está tentando executar.

Se você estiver usando o xargs para montar basicamente uma lista de comandos, você pode obter esse comportamento dizendo xargs para ecoar o comando e, em seguida, canalizando para o bash.

Por exemplo, se você estiver tentando excluir uma lista de coisas que podem ou não existir:

# presume this will fail in a similar way to your command
cat things_to_delete | xargs -n1 delete_command_that_might_exit

# instead echo the commands and pipe to bash
cat things_to_delete | xargs -n1 echo delete_command_that_might_exit | bash

Isso funciona porque, primeiro, o xargs só está chamando echo, por isso não verá nenhum erro. Então, segundo, porque o comportamento padrão do bash continua a execução após uma declaração com falha.

Para ser mais específico sobre o meu caso, eu estava usando isso para remover um monte de versões antigas de aplicativos do AWS ElasticBeanstalk da seguinte forma:

aws elasticbeanstalk describe-application-versions --application-name myapp |\
jq -r '.ApplicationVersions | sort_by(.DateCreated) | .[0:-10] | .[].VersionLabel' |\
xargs -n1 \
  echo aws elasticbeanstalk delete-application-version \
       --delete-source-bundle --application-name myapp --version-label |\
bash
    
por 10.02.2016 / 06:36
2

Após os trabalhos de construção para mim:

ls | xargs -I % svn upgrade %

Mesmo se o upgrade do svn falhou em algum elemento, o processo foi continuado

    
por 24.06.2014 / 18:29
1

Se você estava usando xargs com find , use a opção -exec de find :

find . -name '*.log' -exec somecommand {} \;
    
por 23.10.2014 / 03:55