重要なポイント
- 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 テキスト エディタを使用しますが、お好みのテキスト エディタを使用できます。
タッチhtg.sh
gedithtg.sh
gedit
エディターが開きます。次のテキストをコピーしてエディタに貼り付けます。
#!/bin/bashcho "htg.service: ## 開始 ##" | systemd-cat -p infowhile :doTIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')echo "htg.service: タイムスタンプ ${TIMESTAMP}" | systemd-cat -p infosleep 60done
変更を保存してエディタを閉じます。
このスクリプトは多くのことを行うわけではありませんが、注目に値する点がいくつかあります。
-
2 つの
echoラインは、 プログラムから出力を取得してジャーナルに送信する プログラムであるsystemd-catを介してパイプ処理されます。ジャーナルへのエントリーが優先されます。-p(優先) オプションを使用して、メッセージが情報 (情報) のみを目的としていることを示します。これらは重要なエラーや警告ではありません。 -
無限の
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
エディターが開きます。次のテキストをコピーしてエディタに貼り付けます。
[ユニット]説明=オタク サービスのハウツー例Wants=network.targetAfter=syslog.target network-online.target[Service]Type=simpleExecStart=/usr/local/bin/htg.shRestart=on-failureRestartSec=10KillMode=process[ [インストール]WantedBy=multi-user.target
変更を保存してエディタを閉じます。
エントリには次のような意味があります。これらは典型的なエントリです。私たちの単純なサービスには実際にはそれらのほとんどが必要ありませんが、それらを含めることで説明できるようになります。
- 説明: これはサービスのテキスト説明です。
- 要望: 私たちのサービスは、サービスの開始前にネットワークが稼働していることを望んでいますが、必須ではありません。
- 後: このサービスがまだ実行されていない場合、このサービスが正常に開始された後に開始する必要があるユニット名のリスト。
-
タイプ:
シンプル。
systemd、ExecStartで指定されたプロセスがフォークされるとすぐに、このサービスが開始されたとみなします。 - ExecStart: 開始するプロセスへのパス。
- 再起動: サービスをいつ再起動する必要があるか。 「失敗時」に設定しました。
- RestartSec: サービスの再起動を試行するまでの待機時間。この値は秒単位です。
-
KillMode:
systemctlにサービスの停止を要求した場合に、systemdどのようにプロセスを強制終了するかを定義します。これを「プロセス」に設定しました。これにより、systemdメインプロセスでのみSIGTERMシグナルを使用するようになります。サービスが単純なスクリプトではなく重要なプログラムである場合は、これを「混合」に設定して、生成されたプロセスも確実に終了するようにします。 - WantedBy: これを「multi-user.target」に設定しています。これは、グラフィカル ユーザー インターフェイスが利用できるかどうかに関係なく、システムが複数のユーザーがログインできる状態にある限り、サービスを開始する必要があることを意味します。
ユニット ファイルは実行可能である必要はありませんが、ユニット ファイルに対するアクセス許可により、編集できるユーザーを制限する必要があります。悪意のあるユーザーやいたずらユーザーがユニット ファイルを変更して、別のプログラムを完全に実行することは望ましくありません。
このコマンドは、所有者に読み取りおよび書き込み権限を付与し、グループに読み取り権限を付与します。他の人には権限がありません。
sudo chmod 640 /etc/systemd/system/htg.service
サービスがまだ実行されていない場合でも、
systemctl
にユニット ファイルの構文をチェックさせることができます。エラーがあれば報告されます。 (実際には、「.service」部分はほとんどのコマンドでオプションです。)
systemctl ステータス htg.service
エラーは強調表示されていません。これは、ユニット ファイルが構文的に正しいことを意味します。
systemd コマンドによるサービスの自動開始
新しいユニット ファイルを追加するか、既存のユニット ファイルを編集する場合は、
systemd
ユニット ファイル定義を再ロードするように指示する必要があります。
sudo systemctl デーモン-リロード
起動時にサービスを起動したい場合は、それを有効にする必要があります。
sudo systemctl 有効化 htg
サービスを有効にしてもサービスは開始されません。サービスが起動時に起動されるように設定されるだけです。今すぐサービスを開始するには、
start
オプションを指定して
systemctl
を使用する必要があります。
sudo systemctl start htg
サービスの検証
サービスを手動で開始するか、コンピューターを再起動した後、サービスが正しく実行されていることを確認できます。
sudo systemctl ステータス 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 htg.serviceを無効にする
サービスが実行中の場合、このコマンドはサービスを停止しません。これは単に、次回の再起動時にサービスを起動しないように
systemd
指示するだけです。
サービスを停止して起動時にサービスが起動しないようにするには、両方のコマンドを使用します。
サービスのヒント
プログラムをサービスとして起動する前に、プログラムが期待どおりに実行されることを確認してください。





