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サービスはユーザーサービスです。

この問題を解決する方法がわかりません。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ません。たとえば、noなので、GUIプログラムには特別な処理(読み取り)が必要です。~/.bashrccron$DISPLAYman xhost

cron環境変数は、すべてのジョブの読み取りファイルで設定できます。crontabman 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias各環境の結果を確認してください。
簡単なアプローチは、コマンドをbashスクリプトに保存し、ターミナルセッションで実行し、出力を保存し、「他の」環境でスクリプトを実行して出力を保存することです。 Compareを使用して出力を保存しますdiff

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

関連情報