키오스크 모드에서 작동하도록 데비안을 설정하고 있습니다. 이를 위해 감시 기능을 수행하는 서비스를 만들었습니다.
[Unit]
Description=Watchdog for myapp
[email protected]
After=polkit.service
After=udisks2.service
[Service]
ExecStartPre=systemctl stop dm
ExecStart=su user -c "startx /opt/myapp-watchdog.sh -- :0 vt7"
ExecStop=systemctl start dm
Type=simple
Restart=on-failure
StartLimitInterval=60s
StartLimitBurst=5
RuntimeMaxSec=infinity
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/user/.Xauthority"
Environment="XDG_VTNR=7"
[Install]
WantedBy=graphical.target
문제는 ExecStart가 myapp에서 종료 코드를 가져오는 것이 아니라 startx에서 가져오는 것입니다. 많은 옵션을 시도했지만 작동하는 옵션을 찾을 수 없습니다 ...
종료 코드를 파이프하여 &?를 종료하고 종료 코드를 파일에 쓰려고 했습니다. 그러나 분명히 내 bash 기술은 올바른 명령을 실행하기에 충분하지 않습니다.
인터넷 검색은 사람들이 사용자가 아닌 루트에서 직접 호출하는 경우를 발견하는 데 도움이 되지 않았습니다. 이것이 바로 종료 코드가 제 경우보다 훨씬 쉽게 전송되는 이유입니다.
답변1
알아냈어요. 이 문제는 startx를 통해 해결될 수 없습니다(증거:gitlab의 xserver 오류에 대한 링크). 나는 자전거를 발명하고 지팡이를 사용해야 했습니다.
해결책은 소프트웨어가 루프에서 실행되는 스크립트를 서비스에서 실행하도록 하는 것입니다. 그런 다음 소프트웨어 종료 코드를 확인하십시오. 코드가 0이면 스크립트가 작업을 완료한 것입니다. 그렇지 않으면 루프의 다음 반복을 시작합니다. 아래 코드는 첫 번째 비상 종료 후 마지막 순간에 소프트웨어가 5회 이상 잘못 완료되는 경우 이 루프를 종료하는 메커니즘을 구현합니다.
서비스 코드:
[Unit]
Description=Watchdog for myapp
[email protected]
After=polkit.service
After=udisks2.service
[Service]
ExecStartPre=systemctl stop dm
ExecStart=su user -c "startx /opt/myapp-watchdog.sh -- :0 vt7"
ExecStop=systemctl start dm
Type=simple
Restart=on-failure
StartLimitInterval=60s
StartLimitBurst=5
RuntimeMaxSec=infinity
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/user/.Xauthority"
Environment="XDG_VTNR=7"
[Install]
WantedBy=graphical.target
서비스 스크립트 코드:
#!/bin/bash
RETURN_VALUE="1"
RESET_COUNTER=0
RESET_COUNTER_TIME=0
TIME_NOW=0
echo "myapp-watchdog: myapp-watchdog started"
while [ $RETURN_VALUE != "0" ]
do
echo "myapp-watchdog: myapp started"
/opt/myapp
RETURN_VALUE=$?
TIME_NOW=$(date +"%s")
if [ $RETURN_VALUE == "0" ]
then
echo "myapp-watchdog: myapp exited with code 0"
echo "myapp-watchdog: myapp-watchdog finished"
exit 0
else
if [[ $TIME_NOW -gt $RESET_COUNTER_TIME ]]
then
RESET_COUNTER=0
fi
if [ $RESET_COUNTER == 0 ]
then
RESET_COUNTER_TIME=$TIME_NOW+60
fi
RESET_COUNTER=$((RESET_COUNTER + 1))
echo "myapp-watchdog: abnormal exit code detected. Current number of errors in the last minute: $RESET_COUNTER"
if [ $RESET_COUNTER == 5 ]
then
echo "myapp-watchdog: myapp exited with code 1"
echo "myapp-watchdog: myapp-watchdog finished"
exit 1
fi
fi
done