시작할 올바른 서비스 "유형"

시작할 올바른 서비스 "유형"

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 servicerun-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

시스템 맨페이지

관련 정보