明るい/暗いモードを切り替える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プログラムには特別な処理(読み取り)が必要です。~/.bashrc
cron
$DISPLAY
man xhost
cron
環境変数は、すべてのジョブの読み取りファイルで設定できます。crontab
man 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`