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