Запустить/остановить процесс во встроенном Linux

У меня есть собственная встроенная система Linux на плате PocketBeagle. Я разработал простое приложение gpio на C, которое выдает команду включения/выключения на один из контактов разъемов платы. Приложение называется gpio_aa6 и находится в /root. Первой задачей было найти способ автоматического запуска моего приложения после загрузки платы. Я нашел два способа сделать это; первым было добавить запись в каталог etc/rcS. Эта запись представляет собой простой файл сценария, который запускает мое приложение. Второй способ заключался в редактировании файла /etc/inittab и добавлении записи в этот файл (::respawn:/root/gpio_aa6). В обоих случаях мое приложение было успешно запущено: но я все еще не уверен, что это правильный способ автоматического запуска моего приложения. Затем я пришел ко второй проблеме, как я могу остановить мое работающее приложение, так как респаун повторно запускает приложение, если оно завершено? Я общаюсь с правлением двумя способами; через последовательную связь (используя экранный терминал) и через веб-сервер ([email protected]). Я пытался использовать Ctrl+C, Ctrl+Z, Ctrl+\, но не смог остановить продолжение работы программы. Затем я использовал команду "killall" с killsignals -9 или -15, вроде бы программа прерывается, но сразу после этого снова запускается.

Мое приложение должно работать бесконечно, но мне нужно иногда останавливать его, чтобы обновить и снова запустить.

Есть ли какие-либо предложения, как преодолеть эту проблему? Спасибо.


person AA Son    schedule 03.06.2018    source источник


Ответы (1)


Оба решения, которые вы использовали, верны. Лично я предпочитаю вариант добавления сценария инициализации в /etc/init.d.

Я считаю, что поведение, которое вы наблюдаете, что вы, по-видимому, не можете убить программу, связано с тем, что вы запускаете свою программу из inittab с ключевым словом respawn, которое точно указывает программе инициализации перезапустить ваше приложение после его выхода. Если вы на самом деле проверите PID своего приложения, вы увидите, что он меняется каждый раз, когда вы его уничтожаете.

Поэтому я бы порекомендовал вам вместо этого использовать сценарий инициализации, с помощью которого вы можете реализовать действия запуска и остановки. См. ./package/lldpd/S60lldpd базовый пример в Buildroot.

person Thomas Petazzoni    schedule 21.06.2018