С помощью скрипта X получаем PID процесса, который передает стандартный ввод - PullRequest
0 голосов
/ 09 марта 2012

Я хочу выполнить Program_A и проверить его вывод в Program_B .например,

$ Program_A | Program_B

В пределах Program_B , я хотел бы иметь возможность завершить Program_A , если определенное условие соответствует.

Я ищуспособ сделать это в BASH (есть решение на python с popen).

Кроме того, pidof Program_A и т.п. не являются хорошим решением, так как может быть много примеров итолько конкретный должен быть прекращен.

Ответы [ 2 ]

1 голос
/ 11 марта 2012

Вы можете получить идентификатор процесса Program_A в самой Program_A и распечатать его как первую строку и другие выходные данные для Program_B.Если вы сделаете это, вы можете убить Program_A с помощью вызова kill из Program_B

0 голосов
/ 09 марта 2012

В Program_B вы можете close() stdin при обнаружении условия закрытия.Это приведет к тому, что Program_A получит ошибку при write() и, возможно, прекратит работу.

Теперь Program_A может игнорировать эти ошибки (я не знаю, ваше ли это приложение или предварительно скомпилированный инструмент) ивот идет забавная часть.В Program_B вы можете проверить, откуда взялся ваш стандартный:

my_input=`readlink /proc/$$/fd/0`

, затем, если это что-то вроде "pipe: [134414]", найти любой другой процесс, чей стандартный вывод равен

case "$my_input" in
  pipe:*)
    for p in /proc/[0-9]*
    do
      if [ "$my_input" = "`readlink $p/fd/1`" ]
      then
        bad_guy=`sed -e 's:.*/::' <<< "$p"`
        echo "Would you please finish, Mr. $bad_guy ?!"
        kill $bad_guy
        break
      fi
    done
    ;;
  *)
    echo "We're good";;
esac
...