открытие терминала с командой при загрузке в Debian

Вопрос или проблема

У меня есть приложение, которое является объектным файлом (полученным из исходного кода на 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.

Оцените материал
Добавить комментарий

Капча загружается...