systemdを使用して起動時にLinuxプログラムを実行する方法
公開: 2022-01-29起動時に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 終わり
変更を保存して、エディターを閉じます。
スクリプトはそれほど多くのことをしませんが、注目に値するいくつかのポイントがあります。
- 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
変更を保存して、エディターを閉じます。
エントリにはこれらの意味があります。 これらは典型的なエントリです。 私たちのシンプルなサービスは実際にはそれらのほとんどを必要としませんが、それらを含めることでそれらを説明することができます。
- 説明:これは、サービスのテキストによる説明です。
- 望んでいること:私たちのサービスは、サービスが開始される前にネットワークが稼働していることを望んでいますが、必須ではありません。
- 変更後:このサービスが正常に開始された後に開始する必要があるユニット名のリスト(まだ実行されていない場合)。
- タイプ:シンプル。
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」で、長い説明はユニットファイルで提供したものです。
- どのユニットファイルが「/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コマンド | ||
ファイル | 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 | |
プロセス | エイリアス・screen・top・nice・renice・progress・strace・systemd・tmux・chsh・history・at・batch・free・which・dmesg・chfn・usermod・ps・chroot・xargs・tty・pinky・lsof・vmstat・タイムアウト・wall・yes・kill・sleep・sudo・su・time・groupadd・usermod・groups・lshw・shutdown・reboot・halt・poweroff・passwd・lscpu・crontab・date・bg・fg | |
ネットワーキング | netstat・ping・traceroute・ip・ss・whois・fail2ban・bmon・dig・finger・nmap・ftp・curl・wget・who・whoami・w・iptables・ssh-keygen・ufw |
関連:開発者と愛好家のための最高のLinuxラップトップ