Управление несколькими фоновыми процессами из оболочки во встроенном Linux

#linux #automation #embedded

#linux #автоматизация #встроенный

Вопрос:

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

 wrapperScript.sh $command amp; > output_log.txt
wrapperScript.sh $command2 amp; >output_log2.txt
  

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

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

Редактировать:

Решение:

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

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

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

Ответ №1:

Используйте канал

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

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

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

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

 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)" если ваша оболочка не слишком перегружена функциями). Если ваша команда ожидает a q без перевода строки вообще, просто stuff q .

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

Комментарии:

1. Привет, я попробовал ваше решение. У моей встроенной платы нет экрана, и я не могу использовать mkfifo, потому что у меня нет разрешения. Есть ли какой-либо другой способ :-(.