Программа в фоновом режиме получает поток консольного ввода, в то время как программа монитора работает на переднем плане

Я собрал небольшой скрипт bash, который запускает, а затем периодически проверяет, работает ли моя основная программа (консольное приложение, без графического интерфейса). Предполагается, что мое основное приложение — это внутренняя система устройства, и оно должно работать непрерывно.

# Start myProgram
/path/to/myProgram &

while true
do
if [  -n "`ps ax | grep -v grep | grep myProgram`" ]
then
sleep 5 2>&1 > /dev/null
else
/path/to/myProgram &
fi
done

Моя основная программа содержит цикл c ++ select () (с таймером), который просматривает несколько сокетов TCP, UDP и Unix Domain, а также стандартный ввод.

При запуске на переднем плане myProgram запускается так, как ожидалось. Когда никто не отправляет данные, он просто сидит в тайм-ауте select () каждые 2 секунды, возится с таймерами и тому подобным, а затем снова ждет. Любая клавиатурная активность, заканчивающаяся ENTER, захватывается и обрабатывается. Консольный ввод выводит сообщение «N байт получено на консоли» (пока!)

Однако когда мой скрипт запускает myProgram в фоновом режиме, я получаю постоянный поток сообщений «), полученных на консоли», как если бы stdin закрывался и снова открывался, или какое-то другое приложение отправляет поток ENTER в мое приложение.

Может кто-нибудь объяснить, пожалуйста?

Если на самом деле состояние на заднем плане приводит к тому, что stdin закрывает / открывает ovr и снова, может ли myProgram обнаружить, что он находится в фоновом режиме, и отключиться от stdin? Нужно ли отключаться от stdout и stderr? Думаю, это сделает меня демоном.

И, наконец, будет ли сторожевая программа лучшим способом отследить, что myProgram все еще работает? Может ли сторожевой таймер перезапустить программу вместо перезапуска всей машины?

1

Решение

Только задания переднего плана могут иметь стандартный ввод, подключенный к терминалу. Фоновые задания приостанавливаются, если они пытаются читать с терминала. Вам придется оставить работу на переднем плане или перенаправить стандартный ввод откуда-либо еще.

2

Другие решения

Других решений пока нет …