'xprintidle' 명령은 systemd 서비스에서 0이 아닌 종료 상태 1을 반환합니다.

'xprintidle' 명령은 systemd 서비스에서 0이 아닌 종료 상태 1을 반환합니다.

Raspbian Buster Lite가 설치된 Raspberry Pi가 있는데 자동 로그인을 사용하여 KIOSK 모드로 부팅합니다. 목적은 연결된 7인치 터치스크린(Chromium 포함)에 단일 웹 페이지를 표시하는 것입니다. 시스템이 유휴 상태이면 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 = 거짓
상태변경=거짓
변화 시간 간격 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의 이유를 이해할 수 없었기 때문에 해결 방법을 시도해야 했습니다.

키오스크 모드에서 크롬을 실행하도록 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 브라우저를 키오스크 모드로 실행합니다. 실행할 웹 애플리케이션의 URL이 포함된 환경 변수($KIOSK_URL)를 전달합니다.
# 키오스크 모드에서 Chromium을 실행합니다.
chromium-browser --noerrdialogs --disable-infobars --kiosk --check-for-update-interval=31536000 $KIOSK_URL

관련 정보