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

公開: 2022-01-29
ラップトップの定型化されたターミナルウィンドウ。
Fatmawati Achmad Zaenuri / Shutterstock

起動時にLinuxプログラムを起動する必要がありますか? systemdソフトウェアは、systemdを使用するLinuxディストリビューションでそれを行う方法を提供します。これは、Ubuntuを含む最近のほとんどのディストリビューションです。 統合サービスを作成するプロセスを順を追って説明します。さらに、ジャーナルと話し合います。

このチュートリアルでは、システムの起動時に起動するシステムサービスを設定する方法を示します。 サインイン時にグラフィカルプログラムを起動するには、代わりにデスクトップのスタートアップマネージャを使用してください。

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

コンピュータにインストールしたソフトウェアがLinuxの起動プロセスに接続されることがあるため、コンピュータが起動するたびにプログラムが自動的に起動されます。 これと同じ動作は、独自のプログラムやスクリプト、または実際にはコンピューター上にある他のプログラムを使用して簡単に実現できます。

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

バックグラウンドで実行されるプログラムは、デーモンまたはサービスと呼ばれます。 systemdの末尾の「d」はデーモンを表します。 この記事では、サンプルサービスを作成します。 すべてのボックスにチェックマークを付けるには、次のサービスが必要です。

  • サービスユニットファイルを介してsystemdと統合
  • 起動時に起動
  • systemdの制御インターフェースであるsystemctlを使用して制御可能
  • ジャーナルに書くことができる

サービスプログラムの作成

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

 htg.shに触れます
gedit htg.sh 

広告

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

 #!/ bin / bash

echo "htg.service:##開始##" | systemd-cat -p info

その間 :
行う
TIMESTAMP = $(date '+%Y-%m-%d%H:%M:%S')
echo "htg.service:タイムスタンプ$ {TIMESTAMP}" | systemd-cat -p info
眠る60
終わり

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

geditエディターのhtg.shスクリプト

スクリプトはそれほど多くのことをしませんが、注目に値するいくつかのポイントがあります。

  • 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エディターが開きます。 次のテキストをコピーしてエディタに貼り付けます。

 [単位]
Description = How-To GeekServiceの例

Wants = network.target
After = syslog.target network-online.target

[サービス]
Type = simple
ExecStart = / usr / local / bin / htg.sh
再起動=失敗時
ResetSec = 10
KillMode = process

[インストール]
WantedBy = multi-user.target

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

geditエディターのhtg.serviceユニットファイル

エントリにはこれらの意味があります。 これらは典型的なエントリです。 私たちのシンプルなサービスは実際にはそれらのほとんどを必要としませんが、それらを含めることでそれらを説明することができます。

  • 説明:これは、サービスのテキストによる説明です。
  • 望んでいること:私たちのサービスは、サービスが開始される前にネットワークが稼働していることを望んでいますが、必須ではありません。
  • 変更後:このサービスが正常に開始された後に開始する必要があるユニット名のリスト(まだ実行されていない場合)。
  • タイプ:シンプル。 systemdは、 ExecStartによって指定されたプロセスがフォークされるとすぐに、このサービスが開始されたと見なします。
  • ExecStart:開始する必要のあるプロセスへのパス。
  • 再起動:サービスを再起動する必要がある場合とその場合。 「障害時」に設定しました。
  • ResetSec:サービスの再起動を試行する前に待機する時間。 この値は秒単位です。
  • KillMode: systemctlにサービスの停止を要求した場合にsystemdがプロセスを強制終了する方法を定義します。 これを「処理」に設定しました。 これにより、 systemdはメインプロセスでのみSIGTERMを使用します。 私たちのサービスが単純なスクリプトではなく重要なプログラムである場合、これを「混合」に設定して、生成されたプロセスもすべて終了するようにします。
  • WantedBy:これは「multi-user.target」に設定されています。これは、グラフィカルユーザーインターフェイスが使用可能かどうかに関係なく、システムが複数のユーザーがログインできる状態にある限り、サービスを開始する必要があることを意味します。

ユニットファイルは実行可能である必要はありませんが、ユニットファイルの権限により、編集できるユーザーが制限されている必要があります。 悪意のあるユーザーやいたずら好きなユーザーがユニットファイルを変更して、別のプログラムを実行することは望ましくありません。

このコマンドは、所有者に読み取りと書き込みのアクセス許可、およびグループへの読み取りアクセス許可を付与します。 他の人には権限がありません。

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

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

 systemctl status htg.service 

広告

エラーは強調表示されていません。これは、ユニットファイルが構文的に正しいことを意味します。

サービスの開始

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

 sudosystemctlデーモン-リロード

起動時にサービスを起動する場合は、次のように有効にする必要があります。

 sudo systemctl enable htg

サービスを有効にしても、サービスは開始されません。起動時に起動するように設定されるだけです。 今すぐサービスを開始するには、 startオプションを指定してsystemctlを使用する必要があります。

 sudo systemctl start htg 

サービスの確認

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

 sudo systemctl status htg.service 

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

ターミナルウィンドウでの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に指示するだけです。

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

サービスのヒント

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

関連:開発者と愛好家のための最高のLinuxラップトップ