systemdで起動時にLinuxプログラムを実行する方法

  • systemdは、Ubuntuを含むほとんどのLinuxディストリビューションで、起動時にLinuxプログラムを起動できるソフトウェアです。
  • systemdを使用して、systemctlで制御できる統合サービスを簡単に作成できます。
  • systemdを使用すると、プログラムはジャーナルに書き込むことができるため、サービスのアクティビティを追跡して監視しやすくなります。

起動時にLinuxプログラムを起動する必要がありますか?systemdソフトウェアは、systemdを搭載した任意のLinuxディストリビューションで実行する方法を提供します。これには現在、Ubuntuを含むほとんどのLinuxディストリビューションが含まれます。統合サービスを作成するプロセスについて説明します。さらに、ジャーナルとも通信します。

systemdで起動時にプログラムを実行する

コンピュータにインストールしたソフトウェアがLinuxの起動プロセスに組み込まれることがあり、コンピュータを起動するたびにプログラムが自動的に起動されます。この同じ動作を、独自のプログラムやスクリプト、またはコンピュータ上にある他のプログラムで簡単に実現できます。これは、マシンを起動するとすぐに実行したいサーバーをホストする場合(Minecraftサーバーなど)や、手動で起動せずに実行したい特別なソフトウェアがある場合に便利です。

起動時に起動されるプログラムは、システムおよびサービスマネージャーであるsystemdによって制御されます。systemdは、起動時に実行される最初のプロセスです。常にプロセスID(PID)1を持ちます。コンピュータで実行されている他のすべてのプロセスは、systemdによって、またはsystemdがすでに起動したプロセスによって起動されます。

バックグラウンドで実行されるプログラムは、デーモンまたはサービスと呼ばれます。systemdの末尾の「d」はデーモンの略です。この記事では、サンプルサービスを作成します。すべての条件を満たすには、サービスは次のとおりである必要があります。

  • サービスユニットファイルを通じてsystemdと統合されている
  • 起動時に起動する
  • systemdの制御インターフェースであるsystemctlを使用して制御できる
  • ジャーナルに書き込むことができる

systemdを使用してシステムを起動したときに起動するシステムサービスを設定する方法を示します。ログイン時にグラフィカルプログラムを起動するには、代わりにデスクトップのスタートアップマネージャーを使用します。

systemdが起動するサービスプログラムを作成する

systemdが起動するプログラムが必要です。ここでは、「htg.sh」という名前の単純なスクリプトを作成します。このチュートリアルではGeditテキストエディタを使用しますが、お好みのテキストエディタを使用できます。

touch htg.sh

gedit htg.sh

geditエディタが開きます。次のテキストをコピーしてエディタに貼り付けます。

#!/bin/bashecho "htg.service: ## Starting ##" | systemd-cat -p infowhile :doTIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p infosleep 60done

変更を保存してエディタを閉じます。

スクリプトはそれほど多くのことを行いませんが、注目すべき点がいくつかあります。

  • 2つのecho行は、プログラムからの出力を取得してジャーナルに送信するプログラムであるsystemd-catを介してパイプされます。ジャーナルへのエントリには優先順位が付けられます。-p(優先順位)オプションを使用して、メッセージが情報(info)のみであることを示しています。これらは重要なエラーや警告ではありません。
  • 無限のwhileループがあります。
  • TIMESTAMP変数は、現在の日時​​に設定されます。これはメッセージにフォーマットされ、ジャーナルに送信されます。
  • 次に、スクリプトは60秒間スリープします。
  • 60秒後、ループが繰り返されます。そのため、このスクリプトは1分間に1回、タイムスタンプ付きメッセージをジャーナルに書き込みます。

スクリプトを/usr/local/binディレクトリにコピーします。

sudo cp htg.sh /usr/local/bin

そして、実行可能にする必要があります:

sudo chmod +x /usr/local/bin/htg.sh

サービスユニットファイルを作成する

systemdによって起動される各プログラムには、サービスユニットファイルと呼ばれる定義ファイルがあります。これには、systemdがプログラムを見つけて起動し、その動作の一部を定義するために使用できる特定の属性が含まれています。

新しいサービスのユニットファイルを作成する必要がありますが、既存のユニットファイルに新しいサービスに付けたい名前がないことを確認することが賢明です。

sudo systemctl list-unit-files --type-service

アルファベット順に並べられたユニットファイルのリストをスクロールして、使用したい名前が使用されていないことを確認できます。

サービスは「htg.service」と呼ばれます。その名前のユニットファイルはないので、続行してユニットファイルを作成できます。

sudo gedit /etc/systemd/system/htg.service

geditエディタが開きます。次のテキストをコピーしてエディタに貼り付けます。

[Unit]Description=How-To Geek Service ExampleWants=network.targetAfter=syslog.target network-online.target[Service]Type=simpleExecStart=/usr/local/bin/htg.shRestart=on-failureRestartSec=10KillMode=process[Install]WantedBy=multi-user.target

変更を保存してエディタを閉じます。

エントリには次のような意味があります。これらは一般的なエントリです。単純なサービスにはほとんど必要ありませんが、含めることで説明できます。

  • Description:これは、サービスのテキストの説明です。
  • Wants:サービスは、サービスが開始される前にネットワークが起動していることを必要としますが、必須ではありません。
  • After:このサービスが正常に開始された後に開始する必要があるユニット名のリストです(まだ実行されていない場合)。
  • Type:単純です。systemdはこのサービスを、ExecStartで指定されたプロセスがフォークされるとすぐに開始されたと見なします。
  • ExecStart:開始する必要があるプロセスのパスです。
  • Restart:サービスをいつ、どのように再起動するか。これは「on-failure」に設定しています。
  • RestartSec:サービスの再起動を試みるまでの待機時間。この値は秒単位です。
  • KillMode:systemctlにサービスの停止を要求した場合に、systemdがプロセスをどのように終了するかを定義します。これは「process」に設定しています。これにより、systemdはメインプロセスでのみSIGTERMシグナルを使用します。サービスが単純なスクリプトではなく、複雑なプログラムであった場合、生成されたプロセスも確実に終了するようにこれを「mixed」に設定します。
  • WantedBy:これは「multi-user.target」に設定されており、グラフィカルユーザーインターフェースが利用可能かどうかは関係なく、システムが複数のユーザーがログインできる状態にある限り、サービスを開始する必要があることを意味します。

ユニットファイルは実行可能である必要はありませんが、ユニットファイルのパーミッションは、編集できる人を制限する必要があります。悪意のある、またはいたずらなユーザーがユニットファイルを別のプログラムを実行するように変更することを望んでいません。

このコマンドは、所有者に読み取りと書き込みのパーミッションを、グループに読み取りのパーミッションを与えます。他にはパーミッションがありません。

sudo chmod 640 /etc/systemd/system/htg.service

systemctlにサービスがまだ実行されていなくても、ユニットファイルの構文をチェックしてもらうことができます。エラーは報告されます。(実際、ほとんどのコマンドでは「.service」部分はオプションです。)

systemctl status htg.service

エラーは強調表示されません。つまり、ユニットファイルは構文的に正しいということです。

systemdコマンドでサービスを自動的に開始する

新しいユニットファイルを追加するか、既存のユニットファイルを編集したら、systemdにユニットファイルの定義をリロードするよう指示する必要があります。

sudo systemctl daemon-reload

起動時にサービスを起動したい場合は、有効にする必要があります。

sudo systemctl enable htg

サービスを有効にしても開始されるわけではなく、起動時に起動するように設定されるだけです。サービスを今すぐ開始するには、systemctlstartオプションと一緒に使用する必要があります。

sudo systemctl start htg

サービスの検証

サービスを手動で開始するか、コンピュータを再起動した後、サービスが正しく実行されていることを確認できます。

sudo systemctl status htg.service

サービスのステータスが表示されます。

  • 緑の点は、サービスが正常に実行されていることを意味します。
  • サービスの名前は「htg.service」で、長い説明はユニットファイルで提供したものと同じです。
  • ロードされたユニットファイル「/etc/systemd/system/htg.service」が表示されます。
  • サービスはアクティブで、サービスが起動された時間が表示されます。
  • PIDは7762です。
  • サービスには2つのタスクが関連付けられています。
  • サービスでは合計928キビバイトのメモリが使用されています。
  • 制御グループには「htg.sh」スクリプトと「htg.sh」によって起動されたsleepコマンドが含まれています。ほとんどの場合、sleepコマンドがこのサービスの作業を行います。

このサービスによって生成された最後の10個のジャーナルエントリも表示されます。当然のことながら、すべて1分間隔です。

サービスの停止と無効化

サービスを停止する必要がある場合は、次のコマンドを使用します。

sudo systemctl stop htg.service

これによりサービスは停止しますが、コンピュータを次回再起動したときに再起動するのを防ぐことはできません。起動時にサービスが起動されないようにするには、無効にする必要があります。

sudo systemctl disable htg.service

サービスが実行されている場合、このコマンドでは停止しません。systemdに次回の再起動時にサービスを起動しないように指示するだけです。

サービスを停止して起動時に起動されないようにするには、両方のコマンドを使用します。

サービスのヒント

サービスとして起動する前に、プログラムが期待通りに実行されることを確認してください。