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

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

重要なポイント

  • 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 を使用して起動時に Linux プログラムを実行する方法

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 を使用して起動時に Linux プログラムを実行する方法

サービスユニットファイルの作成

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 を使用して起動時に Linux プログラムを実行する方法

systemd コマンドによるサービスの自動開始

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

 sudo systemctl デーモン-リロード

起動時にサービスを起動したい場合は、それを有効にする必要があります。

 sudo systemctl 有効化 htg

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

 sudo systemctl start htg 

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

サービスの検証

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

 sudo systemctl ステータス htg.service

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

  • 緑色の点は、サービスが正常に稼働していることを意味します。
  • サービスの名前は「htg.service」で、長い説明はユニット ファイルで指定したものです。
  • 「/etc/systemd/system/htg.service」にどのユニットファイルがロードされているかが表示されます。
  • サービスはアクティブであり、サービスが開始された時間がリストされています。
  • PID は 7762 です。
  • このサービスには 2 つのタスクが関連付けられています。
  • 合計 928 キビバイトのメモリ がサービスによって使用されています。
  • コントロール グループには、「htg.sh」スクリプトと、「htg.sh」によって起動される sleep コマンドが含まれます。ほとんどの場合、 sleep コマンドがこのサービスの作業を実行します。

このサービスによって作成された最新の 10 件の日記エントリも表示されます。当然のことながら、両者の間隔は 1 分です。

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

サービスの停止と無効化

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

 sudo systemctl stop htg.service

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

 sudo systemctl htg.serviceを無効にする

サービスが実行中の場合、このコマンドはサービスを停止しません。これは単に、次回の再起動時にサービスを起動しないように systemd 指示するだけです。

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

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

サービスのヒント

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

Linuxコマンド

ファイル

tar pv cat tac chmod grep diff sed ar man pushd popd fsck testdisk seq fd pandoc cd $PATH awk join jq fold uniq journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc · tr

プロセス

エイリアス · スクリーン · トップ · ナイス · renice · 進行状況 · strace · systemd · tmux · chsh · 履歴 · at · バッチ · フリー · what · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · タイムアウト · ウォール · はい · キル · スリープ · sudo · su · タイム · groupadd · usermod · グループ · lshw · シャットダウン · 再起動 · 停止 · パワーオフ · パスワード · lscpu · crontab · 日付 · bg · fg · pidof · nohup · pmap

ネットワーキング

netstat ping ip ss whois fail2ban bmon dig finger nmap ftp curl wget who whoami w iptables ssh-keygen ufw arping firewalld

「 systemd を使用して起動時に Linux プログラムを実行する方法」に関するベスト動画選定!

今更聞けないsystemd入門 (nasa9084) – builderscon tokyo 2019
【LinuC/LPIC合格講座】「ブートプロセス」を徹底理解【ITエンジニア基礎入門】#11