通过 systemd 服务连接到 shell 脚本来运行程序

通过 systemd 服务连接到 shell 脚本来运行程序

我想在特定时间运行一个程序(obs),为此我想编写一个指向 shell 脚本的 systemd 服务文件,然后由计时器执行该文件。

我已经运行了该文件,它确实执行了脚本...但由于某种原因没有执行该程序。

服务文件:

[Unit]
Description=Starting Yoga recording on OBS

[Service]
ExecStart=/usr/local/bin/script.sh

script.sh

#!/bin/bash

echo "yo working" >> /home/user/1.txt

/usr/bin/obs --minimize-to-tray --startrecording

echo "or is it?" >> /home/user/2.txt

字符串确实被写入文本文件,并且script.sh在通过终端执行时确实有效,所以我确定问题出在服务文件上

顺便说一句,如果有帮助的话,我正在使用 Arch 发行版

答案1

我怀疑OBS是一个GUI应用程序。 systemd可以很好地运行脚本,但是 GUI 应用程序需要一些技巧。

首先,乘--user坐公交车。这意味着 OBS 将运行为,而不是作为 root。除了明显的安全优势之外,在用户总线上运行还可以让您的服务继承您的用户环境,包括$DISPLAY您正在使用的环境和您所在的位置$XAUTHORITY。这也意味着运行 bash 将加载您的个人数据.bashrc,这在系统总线上不会发生。为此,请将这些systemd单位从/etc/systemd/system/移至~/.config/systemd/user/

我想在特定时间运行一个程序(obs)

为此使用 systemd 计时器:

#~/.config/systemd/user/obs.timer
[Unit]
Description=Timer for OBS

[Timer]
# Run obs.service every 2 hours
OnCalendar=*-*-* 00,02,04,06,08,10,12,14,16,18,20,22:00:00

[Install]
WantedBy=timers.target

obs.service每两个小时就会触发一次。那么你obs.service可以保持不变:

# ~/.config/systemd/user/obs.service
[Unit]
Description=Starting Yoga recording on OBS

[Service]
ExecStart=/usr/local/bin/script.sh

要使其在启动时启动:

$ systemctl --user enable obs.timer
$ systemctl --user start obs.timer

计时器将触发您的服务,因此您不必显式启动或启用您的服务。

如果您希望该服务立即运行,那么您可以随时自行启动它:

$ systemctl --user start obs.service

相关内容