我已经编写了一个 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
Run Code Online (Sandbox Code Playgroud)
我知道 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
Run Code Online (Sandbox Code Playgroud)
因此,当我停止服务时,我会看到我期望在上述之后打印的打印语句。
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.
Run Code Online (Sandbox Code Playgroud)
在对代码段进行了一些挖掘和注释之后,我发现一行代码似乎在循环中。
#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");
Run Code Online (Sandbox Code Playgroud)
如果我注释掉最后一次更改的目录
chdir(WORKINGDIR);
Run Code Online (Sandbox Code Playgroud)
它贯穿应用程序的其余部分。似乎不太喜欢这个称呼。
我更改了调用以使用 system() 代替
#define WORKINGDIR "cd /home/debian/4190/primary"
system(WORKINGDIR);
Run Code Online (Sandbox Code Playgroud)
虽然它没有挂起,并继续执行应用程序,但它没有将目录更改回工作目录。
请记住,如果我在 systemd 之外运行该应用程序,它的工作方式将与预期的完全一样。
任何人都知道发生了什么事吗?
嗯,这似乎与 .service 设置有关。看来我需要添加一个工作目录到混合中。
WorkingDirectory=
Run Code Online (Sandbox Code Playgroud)
因此,一旦我修改了 .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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22255 次 |
| 最近记录: |