首先对这个简单的问题表示歉意——我将在下面解释更多内容。
我是 Linux 风格系统的新手,显然我已经很多学习。
照这样说...
我的系统
我正在 Raspberry Pi 4 Model B 上运行一个程序。我的操作系统是 Raspbian GNU/Linux 10 (buster)。
我拥有的
我已经用 C++ 生成了一个工作程序,该程序存储在home/pi/Dev
.该程序没有 GUI,但将信息打印到终端中。程序无限循环(使用空for
循环)。
当通过 Geany(pi 上的编辑器)启动程序时,我可以制作并运行该程序,该程序会打开一个新的终端窗口并在那里打印输出。
单击文件夹中的可执行文件时,系统要求我在“执行”和“在终端中执行”之间进行选择。
选择“执行”似乎没有效果(我在任务管理器中查找过该进程?)
选择“在终端中执行”会出现错误:
Failed to execute child process “xterm” (No such file or directory)
使用终端并运行时./myprogram
程序运行,在已打开的终端窗口中打印输出。
我想要的是
我希望该程序在启动时自动运行。
Pi 将“无头”使用,但启用图形界面,这样我就可以使用 VNC 查看桌面;当我打开 VNC 连接时,我希望终端能够运行并显示程序输出。
我尝试过的
我一直在尝试使用 systemd 来启动该程序。
起初我尝试直接启动该程序,但毫无进展;我在网上找不到任何好的信息或示例,大多数示例都使用 bash 或 Python 脚本...如果你不能击败他们,请加入他们...
接下来我在 usr/local/bin/ 中创建(复制)了一个简单的 bash 脚本,名为procamStartup.sh
:
#!/bin/bash
echo test
cd /home/pi/Dev/
./Procam
当使用运行此脚本时./procamStartup.sh
,“test”被打印在终端中,然后程序开始在其下方打印..所以我眼中的脚本是有效的。
接下来我创建了一个名为的service
文件:/etc/systemd/system/
procamStartup.service
[Unit]
Description=Procam Startup Script
After=graphical.target
[Service]
Type=idle
ExecStart=/usr/local/bin/procamStartup.sh
[Install]
WantedBy=graphical.target
我选择Type = idle
这样系统将等待所有进程完成后再启动。
我选择WantedBy=graphical.target
这样程序只会在图形界面启动后启动。
我使用以下命令设置脚本和服务文件夹的执行权限:
sudo chmod +x /usr/local/bin/procamStartup.sh
sudo chmod +x /etc/systemd/system/procamStartup.service
接下来我告诉 systemd 重新加载文件:
sudo systemctl daemon-reload
然后启用脚本在启动时运行:
sudo systemctl enable procamStartup.service
之后我就跑了sudo reboot
。
继续
所以..在发送这篇文章之前,我按照自己的指示进行操作,最后运行:
sudo systemctl status procamStartup.service
报告服务已成功运行并将程序输出打印到日志中。
这还算可以:我可以在程序运行时按预期使用 Pi——只是默认情况下不显示输出。
所以重做我的问题:
systemd 是否可以在启动后自动打开在干净终端中运行的程序?
我还认为我需要更改服务文件;因为它运行一个运行该程序的脚本,所以我可能会启动同一程序的多个实例?
感谢您的阅读。
续续
我现在已经安装了xterm
我已将脚本更改为以下内容:
#!/bin/bash
xterm -hold -e /home/pi/Dev/Procam
当通过 Pi GUI 终端运行此脚本时,我得到了我想要的:一个正确输出的新窗口。
从启动或通过 SSH 运行此程序时,我收到以下错误:
xterm: Xt error: Can't open display: %s
xterm: DISPLAY is not set
我目前正在研究解决这个问题。
答案1
我已经设法获得了我想要的功能。
/usr/local/bin/
我在( )中编辑了脚本,procamStartup.sh
现在阅读以下内容:
#!/bin/bash
DISPLAY=:0 xterm -hold -e /home/pi/Dev/Procam
并将/etc/systemd/system/
( procamStartup.service
) 中的服务文件编辑为:
[Unit]
Description=Procam Startup Script
After=graphical.target
[Service]
Environment=XAUTHORITY=/home/pi/.Xauthority
DISPLAY=:0
User=pi
Type=idle
ExecStart=/usr/local/bin/procamStartup.sh
User=pi
Environment=XAUTHORITY=/home/pi/.Xauthority
[Install]
WantedBy=graphical.target
重新加载后sudo systemctl daemon-reload
,sudo reboot
我现在连接到 VNC,在它自己的终端窗口中看到该程序已经运行了。
星期五的好消息:)
祝大家周末愉快!