- 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
サービスを有効にしても開始されるわけではなく、起動時に起動するように設定されるだけです。サービスを今すぐ開始するには、systemctl
をstart
オプションと一緒に使用する必要があります。
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
に次回の再起動時にサービスを起動しないように指示するだけです。
サービスを停止して起動時に起動されないようにするには、両方のコマンドを使用します。
サービスのヒント
サービスとして起動する前に、プログラムが期待通りに実行されることを確認してください。
コメントする