#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, потому что у меня нет разрешения. Есть ли какой-либо другой способ :-(.