Как приостановить основную команду при передаче вывода в другую команду задержки - PullRequest
0 голосов
/ 04 июля 2019

У меня есть два пользовательских сценария для реализации своих собственных задач, один для вывода некоторых URL-адресов (см. Команду cat ниже) и другой для получения URL-адреса для его анализа с помощью сетевых запросов (см. Ниже команду sleep).

Вот прототип:

Дело 1:

cat urls.txt | xargs -I{} sleep 1 && echo "END: {}"

Вывод END: {} и sleep работает.

Дело 2:

cat urls.txt | xargs -I{} echo "BEGIN: {}" && sleep 1 && echo "END: {}"

Выход

BEGIN: https://www.example.com/1
BEGIN: https://www.example.com/2
BEGIN: https://www.example.com/3
END: {}

но кажется только sleep 1 секунда.

Q1: я немного запутался, почему эти выводы?

Q2: Существуют ли решения для выполнения полной конвейерной команды задержки xargs для каждого cat линейного выхода?

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Вы можете поместить команды в отдельный скрипт:

worker.sh

#!/bin/bash
echo "BEGIN: $*" && sleep 1 && echo "END: $*"

установить разрешение на выполнение:

chmod +x worker.sh

и вызвать его с помощью xargs:

cat urls.txt | xargs -I{} ./worker.sh {}

output

BEGIN: https://www.example.com/1
END: https://www.example.com/1
BEGIN: https://www.example.com/2
END: https://www.example.com/2
BEGIN: https://www.example.com/3
END: https://www.example.com/3

Между BEGIN и END сценарий спит одну секунду.

1 голос
/ 04 июля 2019

Спасибо за shellter и напоминание UtLox, я обнаружил, что ключ xargs.

Вот мой вывод, что интерпретатор shell / zsh разделяет sleep 5 и echo END: {} как другой набор команд, поэтому xargs не получил ожидаемые две встроенные команды && как одну утилитукоманду и замените {} значением в выражении END.Это может быть доказано xargs -t.

cat urls.txt | xargs -I{} -t echo "BEGIN: {}" && sleep 1 && echo "END: {}"

Вдохновленный ответом UtLox, я обнаружил, что могу присоединиться к своему ожиданию с sh -c в xargs.

cat urls.txt | xargs -I{} -P 5 sh -c 'echo "BEGIN: {}" && sleep 1 && echo "END: {}"'

Для-P 5, он заставляет команду утилиты запускаться с максимальным количеством указанных подпроцессов в параллельном режиме, чтобы использовать большинство ресурсов всей полосы.

Готово!

...