Systemdサービスを永久に実行する方法(「起動が完了していません。後でもう一度やり直してください」)

Systemdサービスを永久に実行する方法(「起動が完了していません。後でもう一度やり直してください」)

systemdサービスを作成しましたしなければならない永久に実行されます(組み込みコンピュータで主なタスクを実行するため)。

# /etc/systemd/system/samplerbox.service
########################################
[Unit]
Description=Starts SamplerBox

[Service]
Type=oneshot
ExecStart=/root/SamplerBox/samplerbox.sh
WorkingDirectory=/root/SamplerBox/

[Install]
WantedBy=multi-user.target

実際には、次のことを行います。

# /root/SamplerBox/samplerbox.sh
################################
#!/bin/sh
python /root/SamplerBox/samplerbox.py

このサービスを有効にしました。

systemctl enable /etc/systemd/system/samplerbox.service

起動時に動作して起動します。


ただし、このサービスを有効にしたため、これを行うと次のようにsystemd-analyzeなります。

Bootup is not yet finished. Please try again later.

また、サービスがまだ「アクティブ」/開始されたと見なされるというメッセージが表示されます。

# systemctl status samplerbox
â samplerbox.service - Starts SamplerBox
   Loaded: loaded (/etc/systemd/system/samplerbox.service; enabled)
   Active: activating (start) since Thu 1970-01-01 00:14:01 UTC; 11min ago
 Main PID: 258 (samplerbox.sh)
   CGroup: /system.slice/samplerbox.service
           ââ258 /bin/sh /root/SamplerBox/samplerbox.sh
           ââ260 python /root/SamplerBox/samplerbox.py

サービスを永遠に正しく実行するには?

答え1

解決策は簡単です。交換する必要があります。

[Service]
Type=oneshot

渡す

[Service]
Type=simple

この文書状態:

Type = simple(デフォルト):systemdはサービスがすぐに開始されると見なします。プロセスは分岐してはいけません。このサービスに対して別のサービスを注文する必要がある場合は、ソケットがアクティブでない限り、このタイプを使用しないでください。

...

Type=oneshot: 単一ジョブを実行して終了するスクリプトに役立ちます。 RemainAfterExit=yes を設定することで、プロセスが終了した後でも systemd がサービスがアクティブであると見なすこともできます。

関連情報