\r\n\r\n

ブート時に systemd を使って Linux プログラムを実行する方法

ブート時に Linux プログラムを起動する必要がありますか? systemd ソフトウェアは、現在 ubuntu を含むほとんどのバージョンで利用可能な systemd を使って、あらゆる linux ディストリビューションでこれを行う方法を提供します。我々は、統合サービスを作成するプロセスを説明し、さらに雑誌と対談します...。

ブート時にLinuxのプログラムを起動する必要がありますか?systemdソフトウェアは、現在Ubuntuを含むほとんどのバージョンで利用可能なsystemdを使って、あらゆるLinuxディストリビューションでこれを行う方法を提供します。統合サービスを作るプロセスを説明し、さらに雑誌と対話します。

このチュートリアルでは、システム起動時にシステムサービスを開始するように設定する方法を紹介します。ログオン時にグラフィックプログラムを開始するには、代わりにデスクトップのスタートアップマネージャーを使用します。

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

コンピュータにインストールしたソフトウェアがLinuxのブートプロセスに接続し、コンピュータを起動するたびにプログラムが自動的に起動するようになることがあります。自作のプログラムやスクリプト、あるいはコンピュータ上の他のプログラムでも、同じ動作を簡単に実現することができます。

スタートアップ時に起動するプロセスは、システムと***ウェアsystemdによって制御されます。systemdはスタートアップ時に最初に実行されるプロセスです。常にプロセスID(PID)1を持っています。コンピュータで動作している他のすべてのプロセスは、systemdによって、またはsystemdによってすでに開始されているプロセスによって開始されます。

バックグラウンドで動作するプログラムは、デーモンまたはサービスと呼ばれます。systemdの末尾の「d」は、デーモンの略です。今回は、サンプルサービスを作成します。私たちが提供するサービスは、次のようなものでなければなりません。

  • サービスユニットファイルによるsystemdとの統合
  • スタートアップで開始
  • systemd の制御インターフェース systemctl を使って制御します。
  • 日記をつける能力

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

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

touch htg.sh gedit htg.sh

geditエディタが開きますので、以下のテキストをコピーしてエディタに貼り付けてください。

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

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

脚本にはあまり手を入れていませんが、特筆すべき点がいくつかあります。

  • 2つのエコーラインは、systemdcatというプログラムからの出力を受け取り、ログに送信するプログラムによって送信されます。仕訳が優先されます。私たちは、-p(優先順位)オプションを使って、私たちのメッセージが情報のみ(info)であることを示します。これらは重要なエラーや警告ではありません。
  • 無限に続くwhileループがある。
  • TIMESTAMP変数には、現在の日付と時刻が設定されます。
  • その後、スクリプトは60秒間ハイバネーションします。
  • このサイクルは60秒後に繰り返されるので、スクリプトは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 Example Wants=network.target After=syslog.target network-online.target [Service] Type=simple ExecStart=/usr/local/bin/htg.sh Restart=on-failure RestartSec=10 KillMode=process [Install] WantedBy=multi-user.target

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

これらの項目は、以下のような意味を持ちます。これらは代表的な項目です。私たちのシンプルなサービスには、実際にはほとんど必要ないのですが、それらを含めることで解釈できるようになります。

  • 説明:サービスの説明文です。
  • Wanted:私たちのサービスは、私たちのサービスが開始する前にネットワークを開始することを望んでいますが、必要ではありません。
  • After: このサービスが正常に開始された後に開始されるべきユニット名のリスト(まだ実行中でない場合)。
  • Type: simple. ExecStart で指定されたプロセスがフォークされると、systemd はこのサービスが開始されたものと見なします。
  • ExecStart: 開始すべきプロセスへのパス。
  • Restart: いつ、どのタイミングでサービスを再起動させるか。"on failure "に設定しています。
  • RestartSec: サービスの再起動を試みるまでの待ち時間。この値は秒単位です。
  • KillMode: systemctl にサービスの停止を要求したときに、systemd がどのようにプロセスを終了させるかを定義します。これを「処理」に設定しました。これにより、systemd はメインプロセスに対してのみ SIGTERM シグナルを使用するようになります。サービスが単純なスクリプトではなく、自明ではないプログラムの場合は、派生プロセスも確実に終了させるために「mixed」に設定します。
  • WantedBy:「Multi-User」に設定しています。ターゲットにすることで、GUI の有無にかかわらず、複数のユーザーがログインできる状態であれば、いつでもサービスを開始するようにします。

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

このコマンドは、オーナーに読み取りと書き込みのアクセス権を与え、グループには読み取りアクセス権を与え、それ以外の人はアクセスできません。

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

サービスがまだ稼働していなくても、systemctl にユニットファイルのシンタックスをチェックさせることができるのです。エラーが発生した場合は、報告されます。(実際、ほとんどのコマンドで「サービス」セクションは任意です)。

systemctl status htg.service

エラーがハイライトされないということは、ユニットファイルの言語が **正確であることを意味します。

サービス開始

新しいユニットファイルを追加したり、既存のユニットファイルを編集したりする場合、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スクリプトとsleepコマンドで構成されており、スタートアップのhtg.sh「ほとんどの場合、sleepコマンドはこのサービスの仕事を実行することになります。

また、このサービスが生成した直近の10件のジャーナルを表示すると、当然のことながら、すべて1分間隔になっています。

サービスの停止と無効化

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

sudo systemctl stop htg.service

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

sudo systemctl disable htg.service

サービスが動作している場合、このコマンドはサービスを停止しません。単に systemd に次の再起動でサービスを開始しないように指示します。

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

サービスヒント

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

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ