предотвращать отказ xargs от ошибки при ошибке

Согласно man-странице, xargs прекратится, если одна из строк выполнения завершится с ошибкой 255:

  

Если какой-либо вызов команды завершается со статусом 255, xargs немедленно остановится, не считывая никаких дополнительных данных. Сообщение об ошибке выдается на stderr, когда это происходит.

Как я могу заставить xargs не делать это?

У меня есть 1500 или около того пакетное задание, которое я хочу запустить, по 50 строк за раз. Я обнаружил, что он всегда умирает по определенной линии и не выполняет эту работу. Нехорошо!

Еще лучший вопрос, вопрос о том, что я пытаюсь сделать, заключается в следующем:

Как я могу запустить пакетный скрипт 1500 строк, по 50 строк за раз, чтобы он не покидал задание посередине и чтобы результат был записан в файл журнала какого-то рода?

21 голос | спросил JDS 11 J000000Monday11 2011, 19:56:26

6 ответов


7

Вы можете перенести скрипт perl с помощью другого простого сценария bash:

#!/bin/bash
real-command "[email protected]" || exit 0

Это вызовет real-command , передав все параметры, которые вы передаете этой fake-command , и всегда будет возвращать код выхода 0 (это означает, что это всегда успешный), и xargs никогда не остановятся с этим.

ответил user842313 18 J000000Monday11 2011, 12:04:57
14

Аналогично larsks ответ, но более явный:

xargs sh -c "somecommand || true"
ответил Filippo Vitale 22 Jam1000000amWed, 22 Jan 2014 04:01:29 +040014 2014, 04:01:29
6

Вы можете написать свой вызов xargs для маскировки кодов возврата ваших командных строк. Что-то вроде следующего, xargs никогда не увидит возврат кодов возврата с помощью somecommand :

xargs sh -c "somecommand || :"
ответил larsks 11 J000000Monday11 2011, 20:08:16
3

Просто нашел забавный ответ на этот вопрос, хотя его полезность будет зависеть от команды, которую вы пытаетесь запустить.

Если вы используете xargs для сборки списка команд, вы можете получить это поведение, указав xargs для эхо-команды, а затем перейдите в bash.

Например, если вы пытаетесь удалить список вещей, которые могут или не могут существовать:

# 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

Это работает, потому что, во-первых, xargs только вызывает эхо-сигнал, поэтому он не увидит никаких ошибок. Затем во-вторых, потому что поведение по умолчанию bash для продолжения выполнения после неудачного утверждения.

Чтобы быть более конкретным в моем случае, я использовал это, чтобы удалить кучу старых версий приложений из AWS ElasticBeanstalk, например:

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
ответил matschaffer 10 FebruaryEurope/MoscowbWed, 10 Feb 2016 08:36:25 +0300000000amWed, 10 Feb 2016 08:36:25 +030016 2016, 08:36:25
2

Следующие работы для меня:

ls | xargs -I % svn upgrade %

Даже если svn upgrade не удалось выполнить с некоторым элементом, процесс продолжился

ответил AndreyP 24 J0000006Europe/Moscow 2014, 20:29:22
1

Если вы использовали xargs с помощью find, используйте параметр -exec find вместо:

find . -name '*.log' -exec somecommand {} \;
ответил Roger Dahl 23 +04002014-10-23T05:55:18+04:00312014bEurope/MoscowThu, 23 Oct 2014 05:55:18 +0400 2014, 05:55:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132