Linuxで新しいsystemdサービスを作成する方法

systemdは、多くのよく知られたLinuxディストリビューションのサービスマネージャーです。サービスとは、通常バックグラウンドで実行されるプログラムの単位です。サービスは、本質的にシステムが起動するとすぐに自動的に起動し、無人状態で実行できます。

システムを起動または再起動するたびに実行される自動起動タスクまたはプログラムを作成する必要がある場合は、新しいサービスを作成することを検討できます。Linuxで新しいカスタムsystemdサービスを作成する方法を学びましょう。

ステップ1: サービスファイルの作成

新しいsystemdサービスファイルを作成するには、いくつかの手順が必要です。その最初のステップは、サービスのユニットファイルを作成することです。サービスファイルを作成する前に、その構造を理解する必要があります。

Linuxシステムから実際の動作しているサービスファイルを取得して、サービスファイルについて調べてみましょう。以下はvmtoolsデーモンスサービスのサービスファイルです。

VMwareツールがインストールされたVMwareでLinuxを実行していない限り、この特定のサービスはシステムに存在しない可能性があります。問題のサービスは重要ではありません。なぜなら、すべてのサービス、またはむしろサービスユニットファイルは、必要に応じていくつかのカスタマイズを施した同じ基本構造を持っているからです。

すべてのsystemdサービスファイルには、[Service][Unit][Install]の3つのセクションと、各セクションにいくつかのパラメーターが必要です。各セクションに何が含まれていて、なぜ重要なのかを以下に示します。

1. Unit

Unitセクションには、サービスの説明や依存関係などの重要なメタデータが含まれています。DescriptionBeforeAfterの3つのパラメーターがあります。示唆されているように、Descriptionパラメーターはサービスのコンテキストとそれが何をするかを提供します。

BeforeAfterパラメーターは、サービスを実行するための条件を定義します。たとえば、Webサーバーサービスを開始する場合、ネットワークサービスがオンラインになってから初めて開始する必要があります。そのため、Afterパラメーターの値をネットワークサービスに設定します。

2. Service

Serviceセクションには、ExecStartTypeという2つの必須パラメーターと、ExecReloadなどの他のオプションのパラメーターがいくつか含まれています。

ExecStartはサービスの開始時に実行されるコマンドを定義し、Typeパラメーターは生成されるプロセスのタイプを決定します。

3. Install

このセクションとそのデータは、systemctlコマンドでサービスを有効または無効にするたびに呼び出されます。

いくつかのパラメーターがあります。一般的で必要なものの1つはWantedByです。WantedByパラメーターは、サービスが有効になると起動する必要があるターゲットユニットを定義します。デフォルト値はmulti-user.targetです。

ここで説明したパラメーターは、ユニットファイルで設定できる唯一のパラメーターではありません。公式のsystemd.execドキュメントから、またはターミナルにman systemd.execと入力して、すべてのパラメーターのリストを取得できます。

systemdサービスユニットファイルは常に「.service」という拡張子で終わり、/etc/systemd/system/ディレクトリに保存する必要があります。sudoコマンドを接頭辞として付けて、特権でtouchコマンドを使用してサービスファイルを作成します。

sudo touch /etc/systemd/system/.service

サービスファイルを作成したので、サービスを有効で動作させるために必要な構文でそれを埋めていきましょう。

ステップ2: サービスファイルの設定

デモンストレーションのために、30秒ごとにマシン上のポートをスキャンし、その出力をファイルに保存するためにNmapを実行するサンプルサービスを作成します。このタスクを達成するには、サービスユニットファイルを以下のように構成します。

[Unit]Description=Demonstration of custom nmap service.After=network.target[Service]Type=simpleUser=rootExecStart=/usr/bin/nmap -sS -O -oN /home//results.txt localhostRestart=alwaysRestartSec=30[Install]WantedBy=multi-user.target

ここで説明したパラメーターはすでに説明しましたが、それらが新しく作成したサービスにどのように影響するかを説明し、このユニットで導入された新しいものRestartRestartSecUserも調べましょう。

各セクションのパラメーターの意味を以下に示します。

  • Description: サービスの機能を説明する人間が読めるテキスト。
  • After=network.target: このサービスはnetwork.targetに依存しており、network.targetサービスが開始された後にのみ開始されるようにsystemdに指示します。Afterは直接の依存関係を確立するために使用されないことに注意してください。単にトリガーとして機能します。
  • Type=simple: サービスの種類は複数あります。ただし、このデモンストレーションのサービスは通常のプロセスであるため、そのように宣言します。これのすべての異なる値は、前にリンクされた公式のドキュメントページで見つけることができます。
  • Restart=always: これは、サービスが終了するたびに常に再起動することを意味します。
  • RestartSec=30: これは、サービスの各開始の間隔を30秒に設定します。
  • User=root: これは、サービスがrootユーザーとして実行されることを定義します。この場合、Nmapはroot権限なしでは実行できないため、これは必須のステップです。
  • ExecStart: このディレクティブは、プログラムが適切に機能するために必要なすべてのフラグまたは引数とともに実行されるプログラムへの絶対パスを保持します。
  • WantedBy=multi-user.target: サービスファイルのこのパラメーターは、どのターゲットがサービスを含めるか、またはサービスを「必要」とするかを指定します。サービスがターゲットに含まれている場合、ブートプロセス中にシステムがそのターゲットに到達したときにサービスを開始する必要があることを意味します。この場合、システムがマルチユーザーモードに入るとサービスが開始されます。マルチユーザーモードは、システムが完全に起動され、複数のユーザーがログインしてシステムを使用できる状態です。

ステップ3: サービスの有効化と開始

ユニットファイルを作成したので、サービスをアクティブにするために残っている唯一のステップは、サービスを有効にして実行することです。systemctlコマンドを使用してサービスを有効にして開始できます。

systemctlを使用してサービスを有効、開始、およびステータスを確認する方法を以下に示します。

sudo systemctl enable .servicesudo systemctl start .servicesudo systemctl status .service

これで、カスタムサービスが起動して実行されます。この場合、30秒ごとにNmapスキャンが実行され、出力がホームディレクトリのresults.txtファイルに保存されます。

Linuxでsystemdサービスを設定するのは簡単です!

最初からカスタムサービスを設定するのは最初は大変なことのように思えるかもしれませんが、繰り返しのタスクを実行し、生産性を向上させるために、自己実行型の無人プロセスを設定する非常に簡単な方法です。

デモサービスでは、サービスの構成と設定方法の表面をほとんどかすめていません。サービスをカスタマイズする方法をすべて学ぶには、メモでリンクされている公式ドキュメントを参照することをお勧めします。

サービスの設定と維持が面倒な場合は、Linuxで繰り返しのタスクを自動化する別の方法を検討してください。