'xprintidle'コマンドは、systemdサービスでゼロ以外の終了ステータス1を返します。

'xprintidle'コマンドは、systemdサービスでゼロ以外の終了ステータス1を返します。

Raspbian Buster LiteがインストールされたRaspberry Piがあり、自動ログインを使用してKIOSKモードで起動します。目的は、リンクされた7インチタッチスクリーン(Chromiumを含む)に単一のWebページを表示することです。システムがアイドル状態の場合、Pythonスクリプトはそれを検出して自動的に画面を暗くする必要があります。ユーザーが画面とやり取りすると、照明が点灯します。戻る。

これは私のスクリプト(dim_screen.py)です。

#!/usr/bin/env python3
サブプロセスのインポート
輸入時期
輸入システム

rpi_backlightからバックライトをインポートする

バックライト = バックライト()

#実行コマンドからパラメータを読み込みます。
#暗くなる前のアイドル時間(秒)
アイドルTimeBeforeDimMS = int( sys.argv[1] )*1000

#暗くなったときの明るさ(0〜100の間)
明るさが薄い = int( sys.argv[2] )
明るさ全体 = 100

デフのインポート(cmd):
    #ちょうどヘルパー関数
    subprocess.check_output(cmd).decode("utf-8").strip() を返す

アイドル0 = false
状態変更=偽
変化時間間隔 S = 100/1000 観察

そして事実:
    time.sleep( timeIntervalToWatchChangesS )

    currentIdleTimeMS = int( get("xprintidle") )

    isIdle = currentIdleTimeMS >idleTimeBeforeDimMS
    stateChanged = isIdle0 != isIdle

    isIdleとstateChangedの場合:
        #アイドリング
        バックライト、明るさ=明るさが暗くなる
    elif は isIdle と stateChanged ではありません。
        #ポジティブ
        バックライト。明るさ=明るさ全体

    #現在の状態を次のループの初期状態に設定します。
    アイドル0 =アイドル

私のスクリプトはSSHから起動すると期待どおりに動作します。 (Windows 10システムのPuttyからPiに接続してテストできます。) pi@raspberrypi:~$ /usr/bin/python3 /home/pi/startup_scripts/dim_screen.py 10 25

systemctl start dim_screen.service残念ながら、systemdで(またはそれを介して)起動したときにスクリプトをサービスとして実行しようとすると、そうではありません。私はそれを動作させることはできません。

これは私の薄暗いスクリーン.サービスファイルです:

[単位]
Description = 7インチRaspberry Pi画面がユーザーの対話なしで25分後に自動的に10%の明るさに暗くなるようにします。
以降=マルチユーザー。

[提供する]
ExecStart=/usr/bin/python3 /home/pi/startup_scripts/dim_screen.py 10 25

[インストールする]
WantedBy =マルチユーザー。ターゲット

再起動して実行すると、sudo systemctl status dim_screen.service次の結果が表示されます。

端末出力に失敗しました

私は最も重要なデバッグ情報が次の行だと思います。Command 'xprintidle' returned non-zero exit status 1.

私の考えでは、これは奇妙だと思いますか?xprintidle端末で実行すると、次のことが発生します。

pi@raspberrypi:~$ xprintidle
11399922

つまり、有効な応答を受けましたxprintidle。私が理解していない他のものがあると思いますか?

dim_screen.pyPython script()をサービスとして起動する正しい方法は何ですか?

答え1

この記事は元の質問に対する答えではありません。これは回避策です

xprintidle-returned-non-zero-exit-status-1の理由を理解できなかったので、回避策を試す必要がありました。

キオスクモードでChromeを実行するようにPiを設定したときにこれを行う方法については、このチュートリアルに従いました。RASPBERRY PIタッチスクリーンキオスクの設定ステップ10。このチュートリアルでは、Openboxウィンドウマネージャを設定するように指示されました。 Chromiumブラウザが起動する前にpythonscriptをブランチプロセスとして呼び出すことができます。この「解決策」はおそらくベストプラクティスのすべての可能な規則に違反しますが、私の問題は解決されました。少なくとも、より良い方法を見つけるまで。

これは私のものです/etc/xdg/openbox/autostart

#
# これらの操作は、Openbox X セッションの開始時に実行されます。
#$ HOME / .config / openbox / autostartに同様のスクリプトを配置できます。
#ユーザー固有のタスクを実行します。
#

#GNOME設定ツールを使用するには...
#
#if test -x /usr/lib/arm-linux-gnueabihf/gnome-settings-daemon >/dev/null;
# /usr/lib/arm-linux-gnueabihf/gnome-settings-daemon &
#elif which gnome-settings-daemon >/dev/null 2>&1;Then
#gnomeセットデーモン&
#fi

#XFCE構成ツールを使用するには...
#
#xfce-mcs-管理者&

#まず、電源管理、画面の消去、画面の保存をオフにするコマンドを追加します。私たちはキオスクにこれらの機能が含まれたくありません。
xset -dpms #ディスプレイ電源管理システムの電源を切る
xset s noblank # 画面スペースをオフにする
xset s off #スクリーンセーバーオフ

# 次にChromiumがクラッシュすると、次回起動時にエラーメッセージが表示されることがあります。これは私たちがキオスクで望まないもう一つの機能です。
#警告を引き起こす可能性がある設定ファイルからシャットダウンエラーを削除します。

sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' ~/.config/chromium/'local status'
sed -i 's/"exited_cleanly":false/"exited_cleanly":true/; s/"exit_type":"[^"]\+"/"exit_type":"normal"/' ~/.config/chromium/ デフォルト/デフォルト設定

#ユーザーがアイドル状態のときに(唯一の)画面を暗くするスクリプトを呼び出します。
/usr/bin/python3 /home/pi/startup_scripts/dim_screen.py 10 25 &

#最後に、アップデートが自動的に開始され、Chromiumブラウザがキオスクモードで実行されます。実行するWebアプリケーションのURLを含む環境変数($ KIOSK_URL)を渡します。
#キオスクモードでChromiumを実行します。
chromium-browser --noerrdialogs --disable-infobars --kiosk --check-for-update-interval=31536000 $KIOSK_URL

関連情報