我有一个 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
中为所有作业设置环境变量。crontab
man 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`