我编写了一个 C 应用程序,希望它在启动时运行。软件操作包括 GPIO 操作和我正在使用的 Beaglebone Black 上的附加投影披风。
我最终创建了一个供 Systemd 管理的服务。如下所示
[Unit]
Description=CGBHIS Service
[Service]
Type=simple
User=root
ExecStart=/home/debian/4190/primary/pattern_disp
Restart=on-failure
RestartSec=15
KillMode=process
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target
我知道 systemd 已经以 root 身份运行服务,但发生了一些事情,似乎正在关闭 root 访问权限。当我打印 journalctl 时,我应该看到三个打印语句。然而,我看到的是这个。
Nov 14 17:51:48 beaglebone systemd[1]: Started CGBHIS Service.
Nov 14 17:51:48 beaglebone sudo[9218]: root : TTY=unknown ; PWD=/home/debian/4190/primary ; USER=root ; COMMAND=/usr/sbin/service lightdm stop
Nov 14 17:51:48 beaglebone sudo[9218]: pam_unix(sudo:session): session opened for user root by (uid=0)
Nov 14 17:51:50 beaglebone sudo[9218]: pam_unix(sudo:session): session closed for user root
因此,当我停止服务时,我就会看到我期望的打印语句在上述内容之后打印出来。
Nov 14 17:53:03 beaglebone systemd[1]: Stopping CGBHIS Service...
Nov 14 17:53:03 beaglebone sudo[9266]: root : TTY=unknown ; PWD=/home/debian/4190/primary ; USER=root ; COMMAND=/usr/sbin/service lightdm start
Nov 14 17:53:03 beaglebone sudo[9266]: pam_unix(sudo:session): session opened for user root by (uid=0)
Nov 14 17:53:04 beaglebone pattern_disp[9190]: Number of images: 42
Nov 14 17:53:04 beaglebone pattern_disp[9190]: Start
Nov 14 17:53:05 beaglebone pattern_disp[9190]: CLEAN
Nov 14 17:53:05 beaglebone systemd[1]: Stopped CGBHIS Service.
经过一番挖掘和注释代码部分后,我发现一行代码似乎让事情陷入循环。
#define LED0 "/sys/class/leds/beaglebone:green:usr0"
...
#define REMOVETRIG "echo none > trigger"
#define WORKINGDIR "/home/debian/4190/primary"
chdir(LED0);
system(REMOVETRIG);
chdir(LED1);
system(REMOVETRIG);
chdir(LED2);
system(REMOVETRIG);
chdir(LED3);
system("pwd");
system(REMOVETRIG);
chdir(WORKINGDIR);
system("pwd");
如果我注释掉目录的最后一次更改
chdir(WORKINGDIR);
它会运行应用程序的剩余部分。它似乎不喜欢这个调用。
我改变了调用方式,改用 system()
#define WORKINGDIR "cd /home/debian/4190/primary"
system(WORKINGDIR);
虽然它没有挂起,并继续运行应用程序,但它并没有将目录改回工作目录。
请记住,如果我在 systemd 之外运行该应用程序,它就会完全按照预期的方式工作。
有人知道发生了什么事吗?
答案1
嗯,这似乎与 .service 设置有关。看来我需要添加一个工作目录。
WorkingDirectory=
因此,一旦我修改了 .service 以包含工作目录,它就可以按我需要的方式工作。
这是更新的服务文件。
[Unit]
Description=CGBHIS Service
[Service]
Type=simple
Workingdirectory=/home/debian/4190/primary
ExecStart=/home/debian/4190/primary/pattern_disp
Restart=on-failure
RestartSec=15
KillMode=process
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target