Добавьте эти строки в test.service в / etc / serviced / service:

ое описание:

Я хочу автоматически запустить исполняемый файл (двоичный файл opencv, сгенерировать через c ++) через служебный скрипт systemd после загрузки, но у меня ничего не получилось.

Я сузил ошибку до выражения кода «cv :: imshow (....)», которое открывает окно и отображает изображение. В этот момент код выдает ошибку: «QXcbConnection: не удалось подключиться к дисплею»

Однако, если я вручную выполню sh-скрипт или двоичный файл, оба будут работать нормально. Я искал в стеке поток наиболее распространенные ошибки и пытался исправить все, что смог найти. Я совершенно уверен, что:

Мой сервисный файл фактически запускается при запуске (пока не произошла ошибка)Вручную исполнение бинарного файла работает нормальноВручную выполнение .sh-скрипта работает нормальноУ меня нет ошибок связывания во время выполнения (см. .Sh-script)

Буду признателен за любую помощь. Пожалуйста, помогите мне исправить ошибку, и, пожалуйста, объясните мне, почему эта ошибка вообще возникает в первую очередь. Большое спасибо :)

.

Моя система:

Machine: Raspberry Pi 3 Model B
Architecture: arm32 / ARMv7
OS: NOOBS

.

Мой скрипт в / etc / systemd / system / (test.service):

[Unit]
Description=lalala

[Service]
Type=oneshot
ExecStart=/bin/bash "/home/pi/Desktop/test.sh" start
ExecStop=/bin/bash "/home/pi/Desktop/test.sh" stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Более того, я выполнил следующие команды:

sudo chmod u+rwx /etc/systemd/system/test.service

sudo systemctl enable test

И если я запускаю службу вручную, она работает с той же ошибкой, что и при автозапуске во время процесса загрузки:

sudo systemctl enable test

.

Мой сценарий оболочки (test.sh):

#!/bin/sh -e

exec 2> /tmp/test.sh.log       # send stderr to a log file
exec 1>&2                      # send stdout to the same log file
set -x                         # tell sh to display commands before execution


echo "in script"


start() 
{
    echo "in start"

    sleep 30

    LD_LIBRARY_PATH=/usr/local/OpenCV/lib:/usr/local/SFML/lib:/usr/local/curl/lib:$LD_LIBRARY_PATH
    export LD_LIBRARY_PATH

    /home/pi/Desktop/test/main -e &
}


# THE OTHER CASES, NOT PUT IN HERE (stop, status)


case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status 
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage:  {start|stop|status|restart}"
        exit 1
        ;;
esac

exit 0

.

Минимальный пример моего исходного кода: (исполняемый)

#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main()
{
    cv::Mat frame;
    cv::namedWindow("result", cv::WINDOW_NORMAL);

    ## CRASH

    return 0;
}

.

P.S:

Я в курсе, что есть похожая тема, как эта (Запустить скрипт OpenCV при запуске с imshow). Но так как нет решения этого вопроса, и поскольку у меня есть больше информации для обмена, я подумал, что было бы более уместно начать новую тему.

Ответы на вопрос(1)

Ваш ответ на вопрос