首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么应用程序不从systemd脚本开始

为什么应用程序不从systemd脚本开始
EN

Unix & Linux用户
提问于 2022-12-19 22:15:25
回答 1查看 240关注 0票数 0

无论何时启动系统,我都希望以根用户身份执行脚本。我写了一个shell脚本:

代码语言:javascript
复制
# cat /home/root/demo_wrap.sh 
#!/bin/bash
`/home/root/demo_start.sh` > /dev/null &

当我从shell调用它时,效果很好。我编写了以下服务文件:(根据Edgar Magallon的评论更新):

代码语言:javascript
复制
# cat /etc/systemd/system/demo_start.service 
[Unit]
Description=starts the MH11 demo on EVK

[Service]
Environment="DISPLAY=:0"
Type=forking
XAUTHORITY=/home/root/.Xauthority
ExecStart=/home/root/demo_wrap.sh

[Install]
WantedBy=graphical.target

(我也和DISPLAY:1 S试过,XAUTHORITY=/run/user/0也试过,但没有成功)

但出于某种原因,# systemctl start demo_start不会调用应用程序,而是报告:

代码语言:javascript
复制
[[0;1;31m*[[0m demo_start.service - starts the MH11 demo on EVK
     Loaded: loaded (/etc/systemd/system/demo_start.service; enabled; vendor preset: disabled)
     Active: [[0;1;31mfailed[[0m (Result: exit-code) since Wed 2022-05-11 18:58:25 UTC; 1min 11s ago
    Process: 251 ExecStart=/home/root/demo_wrap.sh (code=exited, status=0/SUCCESS)
   Main PID: 252 (code=exited, status=127)

May 11 18:58:18 smarc-rzv2l systemd[1]: Starting starts the MH11 demo on EVK...
May 11 18:58:18 smarc-rzv2l systemd[1]: Started starts the MH11 demo on EVK.
May 11 18:58:25 smarc-rzv2l demo_wrap.sh[254]: error: XDG_RUNTIME_DIR not set in the environment.
May 11 18:58:25 smarc-rzv2l demo_wrap.sh[254]: Connecting to display server failed!: No such file or directory
May 11 18:58:25 smarc-rzv2l demo_wrap.sh[254]: [ERROR] Wayland::init failed
May 11 18:58:25 smarc-rzv2l demo_wrap.sh[252]: /home/root/demo_wrap.sh: line 2: RZ/V2L: No such file or directory
May 11 18:58:25 smarc-rzv2l systemd[1]: [[0;1;39m[[0;1;31m[[0;1;39mdemo_start.service: Main process exited, code=exited, status=127/n/a[[0m
May 11 18:58:25 smarc-rzv2l systemd[1]: [[0;1;38;5;185m[[0;1;39m[[0;1;38;5;185mdemo_start.service: Failed with result 'exit-code'.[[0m 

export XDG_RUNTIME_DIR="/run/user/0"设置为/etc/profile

代码语言:javascript
复制
export XDG_RUNTIME_DIR=/run/user/$UID

weston显示管理器启动并在HDMI屏幕上正确显示。

环境:

这是在一个嵌入式平台上使用Yocto构建的发行版运行Weston排序器。当我在Weston中启动一个shell窗口并键入echo $DISPLAY时,它不会打印任何我预期的:0:1 (下面是Edgar )。当终端窗口出现在Weston桌面上时。这是一个嵌入式参考平台,只有一个用户root。它没有连接到一个网络,也没有任何人可以通过将任何其他硬件连接到网络来访问它。安全不是问题!

我在系统中发现了以下内容:

代码语言:javascript
复制
# cat /lib/systemd/system/weston\@.service 
[Unit]
Description=Weston Wayland Compositor
RequiresMountsFor=/run
Conflicts=plymouth-quit.service
After=systemd-user-sessions.service plymouth-quit-wait.service

[Service]
User=%i
PAMName=login
EnvironmentFile=-/etc/default/weston
StandardError=journal
PermissionsStartOnly=true
IgnoreSIGPIPE=no

ExecStart=/usr/bin/weston-start -v -e -- $OPTARGS

我的演示应该在此之后启动,但这有点奇怪:# systemctl status weston.service向我展示了:

代码语言:javascript
复制
[[0;1;32m*[[0m weston.service
     Loaded: loaded (/etc/init.d/weston; generated)
     Active: [[0;1;32mactive (exited)[[0m since Wed 2022-05-11 18:57:23 UTC; 33min ago
       Docs: man:systemd-sysv-generator(8)
    Process: 189 ExecStart=/etc/init.d/weston start (code=exited, status=0/SUCCESS)

May 11 18:57:22 smarc-rzv2l systemd[1]: Starting weston.service...
May 11 18:57:23 smarc-rzv2l systemd[1]: Started weston.service.
May 11 18:57:34 smarc-rzv2l weston[196]: Connecting to display server failed!: No such file or directory
May 11 18:57:34 smarc-rzv2l weston[196]: [ERROR] Wayland::init failed
May 11 18:57:35 smarc-rzv2l weston[190]: /etc/profile.d/zz1-demo_wrap.sh: line 2: RZ/V2L: No such file or directory

当韦斯顿还在的时候&跑得很好。

EN

回答 1

Unix & Linux用户

发布于 2023-02-20 17:10:37

所发生的情况是,您的服务文件试图在其他服务启动之前执行您的应用程序。您需要在demo_start.service中添加指令After,该指令只在其他服务已经运行的情况下才告诉服务运行。考虑到您需要Weston排序器,您必须将weston.service添加到指令中。

另外,对于XDG_RUNTIME_DIR错误,同样的逻辑也适用。在这种情况下,您需要添加systemd-user-sessions.service,以便在尝试执行应用程序之前创建/run/user/0目录。此外,还需要将指向Environment目录的路径设置为XDG_RUNTIME_DIR指令。

您的demo_start.service文件应该有以下指令:

代码语言:javascript
复制
[Unit]
Description = starts the MH11 demo on EVK
After = weston.service systemd-user-sessions.service

[Service]
User = root
Environment = "XDG_RUNTIME_DIR=/run/user/0"
ExecStart = /home/root/demo_wrap.sh

[Install]
WantedBy = multi-user.target
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/729031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档