我想在特定时间运行一个程序(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