Python 스크립트를 통해 실행되는 LCD 패널이 있고 패널이 키 입력을 수신하므로 스크립트가 항상 수신됩니다. 컴퓨터가 부팅되자마자 스크립트를 실행하는 시작 서비스를 만들려고 합니다.
내가 읽은 바에 따르면 Type=simple
이것이 가장 잘 작동하지만 스크립트가 실행되지는 않습니다. 하지만 작품 Type=oneshot
은 있습니다 RemainAfterExit=true
. 어떤 아이디어가 있나요?
이것은 LCD-panel.service입니다;
[Unit]
Description=LCD Panel
[Service]
Type=oneshot
RemainAfterExit=true
User=root
WorkingDirectory=/path
ExecStart=/path/start-lcd-panel.sh
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=lcd-panel
[Install]
#WantedBy=multi-user.target
이것은 Python 스크립트를 실행할 start-lcd-panel.sh bash 스크립트입니다.
#!/bin/bash
Application=LCD-Panel
cd /path
if ! [ -e "/path2_exist" ] ; then
#run lcd panel
sudo /path/run-menu.py lcd &
fi
if (( $(pgrep -f -c 'run-menu.py lcd') >= 1 )); then
echo "Started LCD display"
fi
답변1
너무 길면 다음과 같이 요약됩니다. 서비스의 경우 simple
프로세스가 포그라운드에 있고 차단되기를 원합니다. 이것은 제공됩니다ExecStart
배경
맨페이지를 읽어보면 다음과 같은 내용이 눈에 띕니다.
단순함: 귀하의 프로세스 는 실행되기 때문에 가 the service manager consider the unit started immediately after the main service process has been forked off
아닙니다 . 단순함에 대한 나의 해석은 귀하의 프로세스가 포그라운드에 있어서 차단되기를 원한다는 것입니다.It is expected that process configured with ExecStart= is the main of the service
run-meny.py
oneshot: the manager will consider the unit up after the main exits
귀하의 경우 start-lcd-panel.sh
분기 후 종료되는 기본 프로세스입니다 run-menu.py
(줄 끝에 앰퍼샌드가 있습니다). run-menu.py
포크가 어떻게 해석될지, 심지어 자식 프로세스( run-menu.py
)가 메인 프로세스와 함께 죽는지도 잘 모르겠습니다 .
oneshot: 결과를 Note that if this option is used without RemainAfterExit= the service will never enter "active" unit state, but directly transition from "activating" to "deactivating" or "dead" since no process is configured that shall run continuously
설명합니다 .systemctl status
매뉴얼 페이지도 흥미롭습니다.Also note it is generally not to use idle or oneshot for long-running services.
**
내 조언: 나는 스크립트의 사용법이 피상적이라고 생각합니다. 왜냐하면 스크립트가 WorkingDirectory
당신이 가지고 있는 경로인 /path로 전환하기 때문입니다 User=root
. 이는 sudo
스크립트의 .in이 중복된다는 것을 의미합니다. echo
화면이 켜지지 않는 것을 보면 결국 이점이 무엇인지 잘 모르겠습니다 .
반대로 : ExecStart=/path/run-menu.py lcd
.simple