Вопрос или проблема
У меня есть приложение, которое является объектным файлом (полученным из исходного кода на c). Когда я запускаю это приложение из терминала, оно работает нормально.
Я хочу запустить это приложение при загрузке системы. Поскольку все данные журналирования в настоящее время я печатаю в терминале, я хочу открыть терминал и запустить это приложение в терминале (чтобы я мог видеть живые логи и также вводить данные в мое приложение из терминала).
После поиска некоторых учебников я смог создать сервис, который запускает оболочку при загрузке. Я изменил этот скрипт, чтобы открыть терминал и запустить приложение. Если я запускаю скрипт оболочки только из терминала, он работает хорошо.
Но когда я запускаю скрипт из сервиса, я получаю следующее предупреждение:
(x-terminal-emulator:16048): Gtk-WARNING **: cannot open display:
Где я совершаю ошибку?
Здесь я использую beaglebone black, работающий на debian.
- Это мой файл сервиса (
application.service
)[Unit] Description=настройка приложения [Service] WorkingDirectory=/root/application/ ExecStart=/root/application/start_application SyslogIdentifier=application Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
- Вот
start_application.sh
#! /bin/sh # # start_app_server # echo "Запуск сервера приложения" x-terminal-emulator -e "app_server/a.out" echo Готово
*nix способ сделать это заключается в том, чтобы запустить скрипт без терминала и отправить вывод в файл журнала. Например:
app_server/a.out > /var/log/app_server.log &
Затем вы можете добавить его в пользовательский crontab с помощью @reboot
.
Как только это сработает, реальный *nix способ сделать это – создать сервис с некоторой формой IPC, если это необходимо.
Ответ или решение
Чтобы автоматически запускать приложение из терминала при загрузке системы Debian и видеть его вывод в реальном времени, нужно учитывать несколько аспектов, связанных с окружением и правами доступа. Ниже приведены шаги и рекомендации для решения данной задачи.
1. Проблема с доступом к дисплею
Ошибка (x-terminal-emulator:16048): Gtk-WARNING **: cannot open display:
возникает из-за того, что сервис, запущенный через systemd, работает в фоновом режиме и не имеет доступа к X-серверу, необходимому для открытия графического интерфейса терминала. Поэтому следует использовать подход, который не требует открытия нового терминала из сервиса.
2. Запуск приложения в фоновом режиме
Рекомендуется запускать приложение в фоновом режиме и перенаправлять его вывод в лог-файл, чтобы вы могли следить за его работой. Для этого вы можете модифицировать ваш скрипт start_application.sh
следующим образом:
#! /bin/sh
#
# start_app_server
#
echo "Starting application server"
/app_server/a.out > /var/log/app_server.log 2>&1 &
echo Done
3. Настройка службы systemd
Измените файл вашей службы application.service
, чтобы он использовал скрипт start_application.sh
, который теперь будет запускать ваше приложение в фоне и перенаправлять вывод в лог. Убедитесь, что файл службы имеет следующие настройки:
[Unit]
Description=Application Setup
[Service]
Type=simple
WorkingDirectory=/root/application/
ExecStart=/root/application/start_application.sh
SyslogIdentifier=application
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
4. Завершение и перезагрузка службы
После внесения изменений выполните следующие команды для перезагрузки конфигурации systemd и запуска вашей службы:
sudo systemctl daemon-reload
sudo systemctl enable application.service
sudo systemctl start application.service
5. Проверка логов
Чтобы проверить вывод вашего приложения, используйте команду:
tail -f /var/log/app_server.log
Это позволит вам отслеживать логи в реальном времени.
Заключение
Такой подход обеспечит стабильный запуск вашего приложения при старте системы без необходимости открывать графический терминал. Если в будущем вам необходимо будет взаимодействовать с приложением, лучше использовать дополнительные механизмы IPC (межпроцессного взаимодействия) или консольные интерфейсы, чтобы обеспечить надежный обмен данными и командами без графического интерфейса.
Эти рекомендации помогут вам правильно реализовать автоматический запуск приложения при старте системы Debian.