如何在启动 systemctl 服务之前运行命令

如何在启动 systemctl 服务之前运行命令

systemctl我正在为需要初始化环境的 Python 脚本创建服务openvino。在运行 Python 脚本之前,我们必须初始化环境openvino,并且必须从同一终端运行 Python 脚本才能运行它,否则它会抛出错误。我为此创建了以下服务:

[Unit]
Description=Launch application

[Service]
User=john
WorkingDirectory=/home/thingtrax/Documents/ThingTraxVisionPython
Environment=DISPLAY=:0
ExecStartPre=/opt/intel/openvino/bin/setupvars.sh
ExecStart=/usr/bin/python3 /home/john/Documents/ThingTraxVisionPython/rtsp_ttfr.py
Restart=on-failure
RestartSec=30s

[Install]
WantedBy=graphical.target

现在,根据我的理解,我正在使用ExecStartPre它来初始化 openvino 环境。OpenVino 环境无法使用 root 用户初始化,因为我们通常使用 root 运行 systemctl 服务,这就是为什么 python 脚本给出与环境未初始化相关的错误的原因。

有什么办法可以提及所有以 john 用户身份运行的内容吗?请帮忙。谢谢

答案1

编辑:了解实际问题后

根据 OpenVINO 文档:安装适用于 Linux 的英特尔® Distribution of OpenVINO™ 工具套件

创建一个包含两个命令的脚本:

#!/bin/bash
## /yourscript.sh
source /opt/intel/openvino/bin/setupvars.sh
/usr/bin/python3 /home/john/Documents/ThingTraxVisionPython

然后从您的服务文件中调用此脚本:

[Unit]
Description=Launch application

[Service]
User=john
WorkingDirectory=/home/thingtrax/Documents/ThingTraxVisionPython
Environment=DISPLAY=:0
ExecStart=/yourscript.sh
Restart=on-failure
RestartSec=30s

[Install]
WantedBy=graphical.target

第一个版本

我不确定是否完全理解您的问题,但如果您需要以 root 身份运行 openvino 服务并且仅以 John 身份运行 ExecStartPre,您可以创建一个以 John 身份登录并从 ExecStartPre 启动的 shell 脚本:

#!/bin/bash
## /yourscript.sh
su -l john -c '/opt/intel/openvino/bin/setupvars.sh' -

笔记:不要忘记最后的破折号,它将设置 John 环境变量。

然后为其添加执行权限:

# chmod +x /yourscript.sh

从头到尾,以下是之后的服务文件:

[Unit]
Description=Launch application

[Service]
## removed the user param
WorkingDirectory=/home/thingtrax/Documents/ThingTraxVisionPython
Environment=DISPLAY=:0
ExecStartPre=/yourscript.sh ## changed the script to yourscript.sh
ExecStart=/usr/bin/python3 /home/john/Documents/ThingTraxVisionPython/rtsp_ttfr.py
Restart=on-failure
RestartSec=30s

[Install]
WantedBy=graphical.target

答案2

当 systemctl 以 root 身份运行时,您可以使用 sudo 切换到另一个用户,而无需输入密码。例如:

root@leo-pc:~# sudo -u leonid bash
leonid@leo-pc:~$ 

相关内容