ウェブサイト検索

Systemd で新しいサービスユニットを作成して実行する方法


数日前、32 ビットのCentos 8 ディストリビューションを見つけたので、古い 32 ビット マシンでテストしてみたいと思いました。起動後、バグがあり、ネットワーク接続が失われていることに気づきました。起動後は毎回、 手動で「上」 にしなければなりませんでした。そこで問題は、このジョブを実行するスクリプトを、マシンを起動するたびに実行するように設定するにはどうすればよいでしょうか?

さて、これは非常に簡単ですので、サービスユニットを使用したシステムの方法を説明します。その前に、サービス ユニットについて簡単に説明します。

この記事では、systemd の「サービス ユニット」 とは何か、またその作成と実行がいかに簡単であるかを説明します。ここでは「ターゲット」とは何なのか、 なぜそれを「ユニットの集合」と呼ぶのか、 そしてその「願望」は何なのかを簡単に説明していきます。最後に、サービス ユニットを利用して、ブート手順の後に独自のスクリプトを実行します。

コンピュータが提供するサービスのおかげでコンピュータが役立つことは明らかですが、この機能を利用するには、コンピュータが起動してさまざまなレベルに達するときに多くのサービスを呼び出す必要があります。

他のサービスは、たとえばコンピュータがレスキュー レベル (ランレベル 0) に達したときに呼び出され、その他のサービスはマルチユーザー レベル (ランレベル 3) に達したときに実行されます。 。これらのレベルはターゲットとして想像できます。

簡単に言うと、ターゲットはサービス ユニットの集合です。 graphical.target レベルで実行されているサービス ユニットを確認したい場合は、次のように入力します。

systemctl --type=service

ご覧のとおり、 一部のサービスはアクティブで常に「実行中」ですが、他のサービスは 1 回だけ実行されて終了 (終了) します。

サービスのステータスを確認したい場合は、次のように systemctl コマンドを使用できます。

systemctl status firewalld.service

ご覧のとおり、firewalld.service のステータスを確認しました (ヒント: サービス名のオートコンプリートを使用できます) )。 firewalld サービスが常に実行されており、有効になっていることがわかります。

有効と無効はそれぞれ、次回の起動時にサービスが永続的に読み込まれるかどうかを意味します。一方、サービスの開始と停止には現在のセッションの制限があり、永続的なものではありません。

たとえば、次のように入力すると、

systemctl stop firewalld.service
systemctl status firewalld.service

firewalld.service が非アクティブ (停止) ですが、まだ有効になっていることがわかります。これは、次回の起動時にロードされることを意味します。したがって、将来、起動時にサービスをロードしたい場合は、それを有効にする必要があります。なんと素晴らしい結論でしょう!簡単に作成してみましょう。

フォルダーに移動すると、次のようになります。

cd /etc/systemd/system
ls -l

ユニットサービスのいくつかのリンクファイルと、 ターゲットの「ウォンツ」のいくつかのディレクトリが表示されます。たとえば、ブート プロシージャがそのレベルに達したときにマルチユーザー ターゲットがロードしたいものは、/etc/systemd/system/multi-user.target.wants/ という名前のディレクトリにリストされます。 。

ls multi-user.target.wants/

ご覧のとおり、 これにはサービスだけでなく、サービスのコレクションである他のターゲットも含まれています。

connection.service という名前のサービス ユニットを作成しましょう。

vim connection.service

次のコマンドを入力し (挿入モードの場合は 「i 」 を押します)、保存して終了します (「esc 」「:wq! 」 ) :

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

上記を説明すると、サービス タイプのユニットを作成し (ターゲット タイプのユニットも作成できます)、それがnetwork.target の後にロードされるように設定しました (理解できると思います)。起動プロシージャは定義された順序でターゲットに到達します)、サービスが開始されるたびに、これから作成するconup.sh という名前の bash スクリプトを実行したいと考えています。

お楽しみは最後の部分[インストール]から始まります。これは「multi-user.target 」 によって要求されることを示しています。したがって、サービスを有効にすると、そのサービスへのシンボリック リンクが multi-user.target.wants フォルダ内に作成されます。わかった?そして、それを無効にすると、そのリンクは削除されます。とても簡単。

有効にして次のことを確認してください。

systemctl enable connection.service

multi-user.target.wants フォルダーにシンボリック リンクが作成されたことが通知されます。図のように ls コマンドを実行すると確認できます。

ls multi-user.target.wants/

ご覧のとおり、「connection.service 」 は次回の起動の準備ができていますが、最初にスクリプト ファイルを作成する必要があります。

cd /root
mkdir scripts
cd scripts
vim conup.sh

Vim 内に次の行を追加して保存します。

#!/bin/bash
nmcli connection up enp0s3

nmcli コマンドは、enp0s3 インターフェイスのネットワーク接続を確立します。

もちろん、スクリプトで何か他のものを実行したい場合は、2 行目の代わりに何でも入力できます。

例えば、

#!/bin/bash
touch /tmp/testbootfile

これにより、/tmp フォルダ内にファイルが作成されます (サービスが動作していることを確認するためだけに)。

また、示されているようにchmod コマンドを実行して、スクリプトを実行可能にする必要があります。

chmod +x conup.sh

これで準備は完了です。次回の起動まで待ちたくない場合 (すでに有効になっています)、次のように入力して現在のセッションのサービスを開始できます。

systemctl start connection.service

出来上がり!接続は正常に動作しています。

機能を確認するためだけに、スクリプト内にコマンド 「touch /tmp/testbootfile 」 を記述することを選択した場合、このファイルが /tmp フォルダ内に作成されていることがわかります。 。

サービス、要求、ターゲット、および起動中のスクリプトの実行とは何なのかを理解する手助けになれば幸いです。