脚本在 systemd 下无法完全运行

脚本在 systemd 下无法完全运行

我有一个 python 脚本来切换亮/暗模式。

最后有这样一行:

process = subprocess.Popen(binDir + "/polybar.sh")

它指向的脚本是这样的:

#!/bin/env bash

# Terminate already running bar instances
killall -q polybar
polybar >/dev/null 2>/dev/null

如果我从终端执行明/暗脚本,它会完美运行,polybar 会被杀死然后重新启动。

但是,我希望服务能够根据一天中的时间自动切换,因此我制作了一些 systemd 计时器。亮/暗脚本被执行,其中的大部分内容都可以工作,但这个尤其不能,它只会杀死 Polybar 并且不会再次启动。 systemd 服务是一项用户服务。

我不知道如何解决这个问题,systemctl status没有提供任何信息。

为什么脚本从终端启动时可以正常工作,但从 systemd 启动时却不能正常工作?

这是服务文件:

[Unit]
Type=simple
Description=dark mode
Environment="PATH=/home/{{ user }}/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/{{ user }}/bin"
WorkingDirectory=/home/{{ user }}/bin

[Service]
ExecStartPre=/usr/bin/brightnessctl s 200
ExecStart=/usr/bin/python /home/ger/bin/nutra.py dark

和计时器:

[Unit]
Description=Turn screen dark/light at certain times

[Timer]
OnCalendar=*-*-* 18:13:00
Persistent=true


[Install]
WantedBy=timers.target

答案1

通过cron或启动脚本运行的作业或systemd脚本不会在桌面上的同一运行时环境中运行。启动脚本作为root.您的任何PATH更改或其他环境变量设置都不会~/.bashrc自动传播到您的cron作业。例如,没有$DISPLAY,因此 GUI 程序需要特殊处理(读取man xhost)。

可以在Read 文件cron中为所有作业设置环境变量。crontabman 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias查看每个环境中的结果 。
一种简单的方法是将命令存储在bash脚本中,并从终端会话执行它,保存输出,然后从“其他”环境执行脚本,保存输出。使用 比较保存的输出diff

echo "=== id ===";id
echo "=== set ===";set
echo "=== env ===";env | sort
echo "=== alias ===";alias`

相关内容