Управление несколькими фоновыми процессами из оболочки на встроенном Linux - PullRequest
2 голосов
/ 24 октября 2011

В настоящее время я работаю со встроенной системой с ОС Linux.Мне нужно запустить несколько приложений одновременно, и я бы хотел, чтобы они могли запускаться через один скрипт.Один из коллег уже реализовал это, используя скрипт-обертку и коды возврата.

wrapperScript.sh $command & > output_log.txt
wrapperScript.sh $command2 & >output_log2.txt

Но проблема возникает при выходе из приложения.Обычно все приложения, находящиеся во встроенной системе, требуют от пользователя нажатия q для выхода.Но скрипт-обертка вместо того, чтобы делать это, когда получает сигнал kill или пользовательский сигнал, просто уничтожает процесс.Это опасно, потому что скрипт-обертка предполагает, что приложение имеет надлежащие средства для обработки сигнала уничтожения (что не всегда так и приводит к утечкам памяти и нежелательным соединениям с сокетами).Я изучал автоматизацию таких программ, как ожидаемо, но так как я использую встроенную плату, я не могу рассчитывать на это.Есть ли способ в оболочке bash или встроенном C для работы с несколькими процессами, когда одна программа автоматически отправляет программам сигнал q.

Мне также хотелось бы иметь возможность вести журнал и выводфайлы.

РЕДАКТИРОВАТЬ:

Решение:

Хорошо, я нашел проблему к проблеме, Ожидать способ решить эту проблему в любой ситуации.Существует серьезное ограничение, что это может замедлиться, но компромисс в этой ситуации неплох.Я решил использовать Expect Scripting Language для реализации этого решения.Есть определенные компромиссы.

Плюсы: * Точный контроль над встроенным приложением * Может сделать процесс интерактивным для пользователя * Может работать с несколькими процессами

Минусы: * Производительность низкая

1 Ответ

1 голос
/ 25 октября 2011

Использовать канал

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

mkfifo command1.ctrl
{ "$command1" <command1.ctrl >command1.log 2>&1;
  rm command1.ctrl; } &

Использовать экран

Запускать приложения внутри программы Экран .Вы можете выполнять все свои команды в отдельных окнах в одном экземпляре экрана (таким образом вы сэкономите немного памяти).Вы можете указать команды для запуска из файла конфигурации экрана:

sessionname mycommands
screen -t command1 command1
screen -t command2 command2

Чтобы завершить программу, используйте

screen -S mycommands -p 1 -X stuff 'q
'

, где 1 - номер окна для отправкивход в (каждое предложение screen в файле конфигурации запускает окно).Текст после stuff вводится для отправки в программу;обратите внимание на наличие новой строки после q (в некоторых приложениях вместо нее может потребоваться возврат каретки; вы можете получить ее с stuff "q$(printf \\015)", если ваша оболочка не слишком голодна).Если ваша команда ожидает q без какой-либо новой строки, просто stuff q.

Для ведения журнала вы можете использовать функцию ведения журнала Screen или перенаправить вывод в файл, как раньше.

...