ограничение xargs от чтения стандартного буфера в буфер - PullRequest
1 голос
/ 22 февраля 2011

Похоже, xargs читает входные строки из стандартного ввода, даже если он уже запускает максимальное количество процессов, которые он может запустить.

Вот пример:

#!/bin/bash
function xTrigger()
{
   for ii in `seq 1 100`; do echo $ii; sleep 2; done
}
function xRunner()
{
   sleep 10;
   echo $1;
}
export -f xTrigger
export -f xRunner
bash -c "xTrigger" | xargs -n 1 -P 1 -i bash -c "xRunner {}"

20 секунд после запуска вышеуказанного процесса, I killall xTrigger, поэтому xargs буферизовал все, что напечатал xTrigger, поэтому xRunner продолжил печатать 1..10. Я хочу, чтобы он печатал только 1,2

Есть ли способ, с помощью которого мы можем изменить это поведение и заставить xargs читать из stdin только тогда, когда он хочет запустить новую команду, так что xTrigger будет ожидать команды echo до тех пор, пока xargs не прочитает из нее? У моего stdin очень динамичный контент, так что это было бы очень полезно.

Попытка придерживаться xargs только потому, что он будет стабильным и изящным. Хотите писать дополнительный код, только если нет простого способа сделать это с помощью xargs.

Спасибо за вашу помощь!

Ответы [ 3 ]

0 голосов
/ 22 февраля 2011

В моей системе xargs по умолчанию остановится, если одно из выполняемых заданий завершит работу с ненулевым кодом возврата.Следовательно, вы должны посылать сигнал на bid pid, на котором запущен XRunner.

0 голосов
/ 23 февраля 2011

Получил xTrigger для генерации следующего триггера, только когда не запущены задания 'bash -c xRunner'. Отлично работает сейчас:

#!/bin/bash
function xTrigger()
{
   for ii in `seq 1 100`; do 
      echo $ii; 
      while [[ $(psgrep xRunner|grep -v xargs|wc -l) -ge 1 ]]; do
         sleep 2; 
      done
   done
}
function xRunner()
{
   sleep 10;
   echo $1;
}
export -f xTrigger
export -f xRunner
bash -c "xTrigger" | xargs -n 1 -P 1 -i bash -c "xRunner {}"
0 голосов
/ 22 февраля 2011

Разве вам не нужно убивать PID Bash из xTrigger ()?

bash -c "echo $$; xTrigger" | xargs -n 1 -P 1 bash -c 'xRunner "$@"' _
kill -HUP <PID>
...