systemd 是否可以在启动后自动打开在干净终端中运行的程序?

systemd 是否可以在启动后自动打开在干净终端中运行的程序?

首先对这个简单的问题表示歉意——我将在下面解释更多内容。

我是 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-reloadsudo reboot我现在连接到 VNC,在它自己的终端窗口中看到该程序已经运行了。

星期五的好消息:)

祝大家周末愉快!

相关内容