GNU/Linux >> Linux の 問題 >  >> Linux

systemctlを使用して複数のサービスインスタンスを管理する

サービス、サービス、サービス。サービスはコンピューティングの大きな部分です。あなたはサービスについてこの記事を読んでいます。お使いのコンピューターはサービスを実行しています。インターネットはそれらでいっぱいです。

systemctlについて

Linuxでは、サービスを実行および管理する標準的な方法は、systemdユーティリティとコマンドsystemctlを使用することです。 。使い方はかなり簡単です。管理するサービスの名前を知っているだけで、このコマンドを使用してサービスを開始または停止したり、サービスのステータスを確認したり、その他の機能を実行したりできます。

#systemctl start httpd 

#systemctl stop httpd

#systemctl status httpd
ユニットファイル

サービスは、ユニットファイルと呼ばれるファイルで定義されます。これらは通常、ディレクトリ/usr/lib/systemd/systemにあります。 。サンプルリストは次のとおりです:

<前>#lsのは/ usr / libに/にsystemd /システム
auditd.service multi-user.target SYS-カーネルdebug.mount
autovt @ .serviceマルチuser.target.wants SYS-カーネル-tracing.mount
basic.targetにNetworkManager-dispatcher.service syslog.socket
basic.target.wants NetworkManager.service syslog.target.wants
BLK-availability.service NetworkManagerのウェイト-オンライン.service

場合によっては、単一のホストでサービスの複数のインスタンスを実行する必要があります。たとえば、複数のクライアントのウェブサイトを管理している場合、セキュリティ規制により、各クライアントが独自のインスタンスを持つことが求められます。つまり、それぞれに対して新しいApache HTTPサービスを実行する必要がありますが、多くのサービスがあると管理が困難になる可能性があります。 10人の異なる顧客がいる場合、それらを管理するために10個の個別のユニットファイルを作成する必要があります。幸い、サービスの複数のインスタンスを処理するためのより良い方法があります。

@記号

一部のユニットファイルの名前には@記号が含まれていることに注意してください。このシンボルには興味深い意味があります。実際のところ、Apache HTTPサーバーをインストールした後、名前に@記号が含まれているファイル([email protected]など)を含む、いくつかのサービスユニットファイルに気付く場合があります。 。

この例でApacheHTTPサーバーを使用して、これによりシステム管理者の作業が少し楽になる方法を説明します。

#dnf -y install httpd 

#cd / usr / lib / systemd / system
#ls -d http *
httpd.service httpd @.servicehttpd。 service.d httpd.socket httpd.socket.d

@記号は、置換が行われることを示します。 Systemdは、その後に入力したものをすべて受け取り、変数%iを置き換えます。 サービスユニットファイル内。この変数は、[email protected]のこの抜粋で確認できます。 ファイル:

 [Unit] 
Description =ApacheHTTPサーバー
After=network.target remote-fs.target nss-lookup.target
Documentation =man:httpd @ .service(8)

[サービス]
Type =notify
Environment =LANG =C
Environment =HTTPS_INSTANCE =%i
ExecStartPre =/ bin / mkdir -m 710 -p / run / httpd / instance-%i
ExecStartPre =/ bin / chown root.apache / run / httpd / instance-%i
ExecStartPre =/ bin / mkdir -m 700 -p / var / lib / httpd / instance-%i
ExecStartPre =/ bin / chown apache.apache / var / lib / httpd / instance-%i
ExecStart =/ usr / sbin / httpd $ OPTIONS -DFOREGROUND- f conf /%i.conf
ExecReload =/ usr / sbin / httpd $ OPTIONS -k graceful -f conf /%i.conf

デフォルトのhttpdユニットファイルであるhttpd.serviceに注意してください。 、名前に@記号が含まれておらず、外観が異なります。これは、ApacheHTTPサーバーの単一の基本的なデフォルトインスタンスに使用されます。

複数のインスタンスを実行する

システム管理者の詳細

  • Sysadminブログを有効にする
  • 自動化されたエンタープライズ:自動化によってITを管理するためのガイド
  • eBook:システム管理者向けのAnsible自動化
  • 現場からの物語:IT自動化に関するシステム管理者ガイド
  • eBook:SREおよびシステム管理者向けのKubernetesのガイド
  • 最新のシステム管理者の記事

この特別なユニットファイルを使用して複数のインスタンスを実行するには、それぞれに一意の名前が必要です。リトルバンクとビッグバンクの2つのクライアントがあるとします。インスタンスにlittlebankとbigbankという名前を付けます。 1つを管理するには、@記号の後にその名前を追加するだけです。適切なコマンドで各インスタンスを開始します:

  • littlebank:systemctl start httpd@littlebank
  • bigbank:systemctl start httpd@bigbank

ほとんどのサービスでは、異なるインスタンス間の競合を回避するために特定の構成が必要であることに注意してください。ここではそれらすべてについては説明しませんが、Apacheには、一意のリッスンポート番号、PIDファイル、ドキュメントルートなど、いくつかのものが必要です。

littlebankインスタンスを起動してデモンストレーションします。失敗すると思いますが、役立つステータスメッセージが表示されます:

#systemctl start httpd @ littlebank 

#systemctl status httpd @ littlebank
[email protected]サーバー
ロード済み:ロード済み(/ usr / lib /systemd/system/[email protected];無効;ベンダープリセット:無効)
アクティブ:失敗(結果:終了コード)Tue 2020-11-10 11:41:20 EST; 1分58秒前
ドキュメント:man:httpd @ .service(8)
プロセス:2205 ExecStartPre =/ bin / mkdir -m 710 -p / run / httpd / instance-littlebank(code =exited、status =0 / SUCCESS)
プロセス:2207 ExecStartPre =/ bin / chown root.apache / run / httpd / instance-littlebank(code =exited、status =0 / SUCCESS)
プロセス:2208 ExecStartPre =/ bin / mkdir -m 700 -p / var / lib / httpd / instance-littlebank(code =exited、status =0 / SUCCESS)
プロセス:2209 ExecStartPre =/ bin / chown apache.apache / var / lib / httpd / instance-littlebank(code =exited、status =0 / SUCCESS)
プロセス:2210 ExecStart =/ usr / sbin / httpd $ OPTIONS -DFOREGROUND -f conf / littlebank.conf(code =exited、status =1 / FAILURE)
メインPID:2210(code =exited、status =1 / FAILURE)
CPU:26ms

Nov 10 11:41:20 localhost.localdomain systemd [1 ]:ApacheHTTPサーバーを起動しています...
11月10日11:41:20localhost.localdomain httpd [2210]:httpd:構成ファイル/etc/httpd/conf/littlebank.conf>
11月10日11:41:20l ocalhost.localdomain systemd [1]:[email protected]:メインプロセスが終了しました、code =exited、status =1 / FAIL>
Nov 10 11:41:20 localhost.localdomain systemd [1]:httpd @ littlebank .service:結果'exit-code'で失敗しました。
11月10日11:41:20localhost.localdomain systemd [1]:ApacheHTTPサーバーの起動に失敗しました。

systemdが%iの代わりにインスタンス名を正しく置き換えていることがわかります ユニットファイルの変数。ただし、Apacheは構成ファイルを開くことができなかったため、起動に失敗します。そこで、必要な構成ファイル(littlebank.conf)の作成を含むようにインスタンスを設定します。 およびbigbank.conf/etc/httpd/conf/内 :

#ls / etc / httpd / conf 
bigbank.conf httpd.conf littlebank.conf

これで、systemctlを使用して各インスタンスを管理できます。 。 startを発行します およびstatus それぞれへのコマンド。出力を最も関連性の高い詳細に短縮しました:

#systemctl start httpd @ bigbank 
#systemctl start httpd @ littlebank

#systemctl status httpd @ bigbank
[email protected]サーバー
ロード済み:ロード済み(/usr/lib/systemd/system/[email protected];無効;ベンダープリセット:無効)
アクティブ:アクティブ(実行中)(火曜日2020-11-10 12:26:06 EST以降); 56分前

#systemctl status httpd @ littlebank
[email protected]サーバー
ロード済み:ロード済み(/ usr / lib / systemd / system / httpd @ .service;無効;ベンダープリセット:無効)
アクティブ:アクティブ(実行中)2020年11月10日火曜日12:25:58 EST; 55分前

これらのインスタンスのプロセスビューは次のとおりです。 Apacheはサーバープロセスをフォークしているため、複数あります。これは通常、次のように行われます。

#pgrep -a httpd 
2834 / usr / sbin / httpd -DFOREGROUND -f conf / littlebank.conf
2835 / usr / sbin / httpd -DFOREGROUND -f conf / littlebank.conf
2836 / usr / sbin / httpd -DFOREGROUND -f conf / littlebank.conf
3061 / usr / sbin / httpd -DFOREGROUND -f conf / bigbank.conf
3062 / usr / sbin / httpd- DFOREGROUND -f conf / bigbank.conf
3064 / usr / sbin / httpd -DFOREGROUND -f conf / bigbank.conf
使用する

この小さなsystemd機能は、サービスの多くのインスタンスが必要な場合に非常に役立ちます。ぜひご活用ください。


Linux
  1. Gnome-terminalの真の複数プロセスインスタンスを実行しますか?

  2. 基本サービスコマンド

  3. Systemctlを使用してサービスを管理する

  1. ChronyでNTPを管理する

  2. systemctl:コマンドが見つかりません

  3. Linux での systemctl コマンドの例

  1. systemdを使用してスタートアップを管理する

  2. LinuxでSystemctlを使用してSystemdサービスを管理する方法

  3. LinuxでPyenvを使用して複数のPythonバージョンを管理する方法