Как определить, что процесс переднего плана ожидает ввода в UNIX?

Мне нужно создать сценарий (ksh или perl), который запускает определенное количество параллельных заданий (другие сценарии), каждое из которых выполняется как процесс переднего плана в отдельном сеансе. Кроме того, я начинаю отслеживать задание, которое должно определить, ожидает ли какой-либо из этих сценариев ввода от оператора, и при необходимости переключаюсь на соответствующий сеанс. Моя проблема в том, что я не нашел хорошего способа определить, что процесс ожидает ввода. Для фонового процесса это довольно просто: состояние процесса «остановлено», и это можно легко проверить с помощью команды 'ps'. В случае переднего плана это не работает. До сих пор я пытался подключиться к процессу с помощью dbx или truss, чтобы увидеть, зависает ли он на «чтении», но этот подход кажется слишком тяжелым. Не могли бы вы предложить лучшее решение? Perl, shell, C, Java и т. Д.… Допустимы, если они являются стандартными и не требуют установки дополнительных сторонних или специфичных для ОС вещей.

Спасибо.


person AndyH    schedule 27.06.2013    source источник
comment
Грубый метод - запустить его под strace & monitor для read () из stdin (fd == 0).   -  person anishsane    schedule 27.06.2013


Ответы (1)


То, о чем вы спрашиваете, невозможно, по крайней мере, ненадежно. Процесс может использовать select или другой метод опроса вместо блокировки read вызова. . Вы не можете знать, ожидает ли он ввода оператора или занят другими делами, и в целом это может быть и то, и другое (выполнение чего-либо в фоновом режиме, реагируя на ввод оператора).

Обычный способ для программы сигнализировать о том, что она ожидает ввода оператора, - это напечатать приглашение. Таким образом, вы должны считать сеанс активным, если он отображает запрос с момента последнего ввода данных.

Если ваши программы не ведут себя подобным образом, вам нужно будет найти другой специфичный для программы способ узнать, что эти процессы ожидают ввода.

person Gilles 'SO- stop being evil'    schedule 02.07.2013