我是 LINUX 操作系统的初学者,我的问题是下一个:
我有一个从 C++ 源代码编译的 bin,它使用 OpenCV 和另一个库,它在屏幕上显示 USB 摄像头提供的图像。我的代码工作正常,下一步是每次我的主板开机时执行这个 bin 文件。我做了一些研究,发现可以帮助我的可靠方法是创建我自己的可以使用 systemctl 启用的服务。我尝试过,但没有成功,但我不确定我的服务文件是否已正确配置。另外,我尝试使用启动应用程序,再次失败。 PS:我的主板:Nvidia Jetson Tx2,我的操作系统:Ubuntu 18.04 LTS。
我正在等待任何建议,并感谢您的回复。谢谢!
编辑:我的服务文件配置:
[Unit]
Description=Script that will execute my bin
[Service]
ExecStart=/home/nvidia/Desktop/daemonScripts/daemonVDM.sh start
[Install]
WantedBy=multi-user.target
这daemonVDM.sh
#!usr/bin/bash
path_vdm_bin="/home/nvidia/Desktop/running"
cd $path_vdm_bin
./vdm --camera-sources 1
输出systemctl status myscript
myscript.service: Main process exited, code=exited, status=203/EXEC
myscript.service: Failed with result 'exit-code'
我的 shell daemonVDM.sh 工作正常
我执行了以下命令:
sudo chmod 777 myscript.service
systemctl start myscript
systemctl enable myscript
答案1
这部分是错误的
#!usr/bin/bash
请尝试
#! /bin/bash
实际上让我们进一步简化它:
#! /bin/bash
cd /home/nvidia/Desktop/running && ./vdm --camera-sources 1
现在,vdm
仅当脚本能够进入目标目录时,应用程序才会运行,否则将退出。
[Service]
ExecStart=/home/nvidia/Desktop/daemonScripts/daemonVDM.sh start
start
虽然没有什么坏处,但没有必要。您只需将其删除即可。您的 bash 脚本根本不处理任何命令行参数。
答案2
我找到了解决方案。这是服务文件的配置:
[Unit]
Description=Script that will execute my bin
[Service]
ExecStart=/home/nvidia/Desktop/daemonScripts/daemonVDM.sh
Environment="DISPLAY=:1"
Environment="XAUTHORITY=/run/user/1000/gdm/Xauthority"
RestartSec=30
Restart=always
[Install]
WantedBy=multi-user.target