systemdを使用してRaspberryPiの起動時にプログラムを起動する方法

Raspberry Piは、さまざまなアプリケーションやプロジェクトに使用できる強力なSBC(シングルボードコンピューター)です。その汎用性は、Raspberry Pi OSやその他のLinuxベースのオペレーティングシステムのおかげで、カスタムスクリプトを含むすべての種類のプログラムを実行できることにあります。

Raspberry Piでスクリプトまたはプログラムを実行するのは、システムでそれを見つけて実行するのと同じくらい簡単です。しかし、おそらくプロジェクトでこのプロセスが必要なため、またはワークフローを合理化したいために、このプロセスを自動化したい場合はどうでしょうか。

これに対する1つの答えは、systemdの使用方法を学ぶことです。

Systemdとは何ですか?

systemdは、最新のLinuxシステムでのサービス構成と動作のためのシステムコンポーネントのスイートです。これは、システムの起動時に起動する最初のプロセスであるため、 PID(プロセス識別子) 1で識別されます。概して、systemdの目的は、システムの起動時にプログラムを管理および実行するのを支援することです。これが、Piでの起動時にプログラムを起動するために活用するものです。

最初に述べたように、Linuxシステムで起動時にプログラムを実行するには、rc.local、cron、autostartなどのいくつかの方法があります。ただし、GUI(グラフィカルユーザーインターフェイス)プログラムを起動したり、特定のシステムプロセスの開始後に実行するアプリケーションを自動化したり、スケジューリングが機能するまでプログラムを何度も実行したりする場合、systemdは多くのより良いソリューションになります。

関連: CronとCrontabを使用してLinuxでタスクをスケジュールする方法

systemdを使用して起動時にプログラムを起動する方法

systemdは、Linuxシステムで起動時にプログラムを起動する少し複雑な方法です。ただし、他の方法(前述の方法)よりも優れたスケジューリングの柔軟性は、あらゆる面でその複雑さを完全に上回っています。

systemdメソッドは、デバイス、サービス、ソケット、起動ターゲット、およびその他の重要なシステムコンポーネントに関するエンコード情報を保持する.iniファイルのようなユニットファイルを使用します。

ユニットファイルにはさまざまな種類があります。したがって、宣言するリソースの種類に基づいて、それに応じてユニットファイルタイプを選択する必要があります。ただし、このガイドでは、システム上のプログラムとスクリプトの起動動作を管理できる.serviceユニットファイルを使用します。

以下は、systemdを使用して起動時にスクリプト/プログラムを起動するための手順の内訳です。

サービスの作成

起動時にプログラムを実行するように設定するには、systemdにどのプログラムをいつ実行するかを指示するサービスユニットファイルを作成します。これがその方法です。

  1. CLIウィンドウで、 sudo nano / lib / systemd / system / display.serviceと入力します。拡張子が.serviceである限り、サービスには任意の名前を使用できます。
  2. サービスファイルに、次のコード行を貼り付けます。
     [Unit]
    Description=PiCounter
    After=network.target
    [Service]
    ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
    Restart=always
    User=pi
    [Install]
    WantedBy=multi-user.target

すべての一般的な構成オプションは「ユニット」セクションと「インストール」セクションに分類され、サービス固有の構成オプションは「サービス」セクションに分類されます。

変更が必要になる可能性のある上記のディレクティブと値のペアのいくつかは次のとおりです。

私。変更後:サービスをいつ開始するかを決定します。 network.targetに設定すると、現在のユニットを開始する前に、リストされている値(この場合はnetwork.target)が開始されます。ただし、サービスがトリガーする依存関係を指示するものではありません。これは、Wants、Requires、WantedByなどの他のディレクティブを介して行われます。

もちろん、プロジェクトの要件に合わせてこの値を変更できます。たとえば、Raspberry Piがネットワークに接続した後にプログラムを実行する場合は、 network-online.target値を使用できます。これらの値の詳細については、systemdに関するFedoraのドキュメントを参照してください。

ii。 ExecStart:起動時に実行する絶対パスとプログラム/スクリプト名を保持します。したがって、実行する内容に応じて、これら両方のディレクティブに値を追加する必要があります。

iii。ユーザー:ラズベリーパイの名前を識別します。 Piの名前を変更した場合は、その値をユーザーに設定する必要があります。

iv。 WantedBy:ユニットのトリガーを指定する最も一般的な方法です。 multi-user.targetに設定することで、システム制御がマルチユーザーシェルに渡されたときにプログラムを実行する依存関係を確立できます。

さらに、これにより、PiのX-Windowsシステムが起動する前にプログラムが実行されます。つまり、システムにログインする前でもプログラムが実行されます。 Raspberry Piにログインする前にスクリプトを実行する場合は、これにより実行できます。

上記のコード行は、非GUIプログラムで機能します。ただし、systemdを使用してGUIプログラムを実行する場合は、サービスファイルに次のコードを追加する必要があります。

 [Unit]
Description=PiCounter
After=network.target
[Service]
Environment=Display=:0
Environment=XAUTHORITY/home/pi/.Xauthority
ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
Restart=always
[Install]
WantedBy=multi-user.target

上記のディレクティブと値のペアでは、変更する必要があるのはExecStartディレクティブの値だけです。コードブロック内のものを、起動時に実行するプログラムに置き換えます。サービスファイルにデータを入力したら、 CTRL + Oを押して保存します。

サービスをテストする

サービスの準備ができたら、それが機能するかどうかを手動で確認します。これを行うには、ターミナルで次のコマンドを入力します: sudo systemctl startdisplay.service 。サービスは命令を正常に実行する必要があります。

完了したら、 sudo systemctl stopdisplay.serviceで終了します。

サービスを有効にする

サービスを使用してプログラムを正常に実行できた場合は、サービスを有効にして、RaspberryPiを起動するたびにプログラムが自動的に実行されるようにします。

これを行うには、ターミナルウィンドウでsudo systemctl enabledisplay.serviceと入力します。それが完了したら、 sudorebootと入力してPiを再起動します。

Raspberry Piが起動すると、systemdは提供された指示に従ってプログラムを実行する必要があります。

RaspberryPiでの起動時のプログラム起動の自動化

ほとんどのLinuxシステムと同様に、Raspberry Pi OSでもいくつかの方法で操作を実行でき、プログラムの起動のスケジュールにも当てはまります。したがって、起動時にGUIプログラム/スクリプトを起動し、スケジューリングをより適切に制御したい場合は、systemdが明らかに優れた方法です。

ただし、より単純なソリューションが必要な場合、またはプロジェクト要件で特定のスケジューリングが必要な場合は、起動時にRaspberryPiプログラムまたはスクリプト実行するためのガイドで詳細を確認できます