Я собрал небольшой скрипт 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 все еще работает? Может ли сторожевой таймер перезапустить программу вместо перезапуска всей машины?
Только задания переднего плана могут иметь стандартный ввод, подключенный к терминалу. Фоновые задания приостанавливаются, если они пытаются читать с терминала. Вам придется оставить работу на переднем плане или перенаправить стандартный ввод откуда-либо еще.
Других решений пока нет …