簡単な説明:
起動後にsystemdサービススクリプトを介して実行可能ファイル(opencvバイナリファイル、c ++経由で生成)を自動起動したいのですが、失敗します。
エラーを、ウィンドウを開いて画像を表示するコードステートメント「cv :: imshow(....)」に絞り込みました。この時点で、コードは次のエラーをスローします:「QXcbConnection:ディスプレイに接続できませんでした」
ただし、sh-scriptまたはバイナリを手動で実行すると、どちらも正常に機能します。私はstackoverflowで最も一般的なエラーを検索し、見つけたすべてを修正しようとしました。私はかなり確信しています:
助けていただければ幸いです。エラーの修正を手伝ってください。そもそもなぜこのエラーが発生するのかを説明してください。どうもありがとう :)
。
私のシステム:
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;
}
。
PS:
私はこのような同様のスレッドがあることを知っています(imshowで開始時にOpenCVスクリプトを実行します)。しかし、この質問に対する解決策はなく、共有する情報が多いので、新しいスレッドを開始する方が適切だと思いました。
幸いなことに、私は問題を解決しました:
問題は、serviced-scriptの構成にありました。Xディスプレイの場所にDISPLAY変数が必要であることは知っていましたが、承認が必要であることに気づいていませんでした。このスレッドは私がそれを理解するのを助けました:
https://unix.stackexchange.com/questions/85244/setting-display-in-systemd-service-file
要するに:
これらを/ etc / serviced / serviceのtest.serviceの行に追加します。
Environment=XAUTHORITY=/home/pi/.Xauthority
Environment=DISPLAY=:0.0
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加