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

トラブルシューティングツールとしてsystemdの使用を開始します

systemdをトラブルシューティングツールと見なす人は誰もいませんが、ウェブサーバーで問題が発生したとき、systemdとその機能に関する知識が増えたことで、問題を特定して回避することができました。

問題は、ホームオフィスネットワークにネームサービス、DHCP、NTP、HTTPD、およびSendMail電子メールサービスを提供するサーバーyorktownが、通常の起動時にApacheHTTPDデーモンを起動できなかったことです。実行されていないことに気付いた後、手動で開始する必要がありました。問題はしばらく続いていましたが、最近、問題を解決しようと試みました。

systemd自体がこの問題の原因であると言う人もいますが、私が今知っていることに基づいて、私はあなたに同意します。しかし、私はSystemVで同様のタイプの問題を抱えていました。 (このシリーズの最初の記事では、古いSystemV initプログラムとスタートアップスクリプトの代わりとしてsystemdをめぐる論争を見ました。systemdについてもっと知りたい場合は、2番目と3番目の記事も読んでください。)完璧なソフトウェアはなく、systemdもSystemVも例外ではありませんが、systemdは、これまでに提供されたSystemVよりもはるかに多くの問題解決情報を提供します。

問題の特定

この問題の原因を見つけるための最初のステップは、httpdサービスのステータスを判別することです。

[root@yorktown ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Thu 2020-04-16 11:54:37 EDT; 15min ago
     Docs: man:httpd.service(8)
  Process: 1101 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 1101 (code=exited, status=1/FAILURE)
   Status: "Reading configuration..."
      CPU: 60ms

Apr 16 11:54:35 yorktown.both.org systemd[1]: Starting The Apache HTTP Server...
Apr 16 11:54:37 yorktown.both.org httpd[1101]: (99)Cannot assign requested address: AH00072: make_sock: could not bind to address 192.168.0.52:80
Apr 16 11:54:37 yorktown.both.org httpd[1101]: no listening sockets available, shutting down
Apr 16 11:54:37 yorktown.both.org httpd[1101]: AH00015: Unable to open logs
Apr 16 11:54:37 yorktown.both.org systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE
Apr 16 11:54:37 yorktown.both.org systemd[1]: httpd.service: Failed with result 'exit-code'.
Apr 16 11:54:37 yorktown.both.org systemd[1]: Failed to start The Apache HTTP Server.
[root@yorktown ~]#

このステータス情報は、SystemVが提供するものよりもはるかに便利なsystemd機能の1つです。ここで役立つ情報の量は、私を正しい方向に導く論理的な結論に簡単に導きます。古いchkconfigから得たものすべて コマンドは、サービスが実行されているかどうか、および実行されている場合はプロセスID(PID)です。それはあまり役に立ちません。

このステータスレポートのキーエントリは、HTTPDがIPアドレスにバインドできないことを示しています。つまり、着信要求を受け入れることができません。これは、IPアドレスがまだ設定されていないため、ネットワークがHTTPDサービスがIPアドレスにバインドする準備ができるほど速く起動していないことを示しています。これは発生しないはずなので、ネットワークサービスのsystemdスタートアップ構成ファイルを調べました。正しい「after」および「requires」ステートメントですべてが正しいように見えました。これが/lib/systemd/system/httpd.serviceです サーバーからのファイル:

# Modifying this file in-place is not recommended, because changes                                                                                    
# will be overwritten during package upgrades.  To customize the                                                                                      
# behaviour, run "systemctl edit httpd" to create an override unit.                                                                                  
                                                                                                                                                     
# For example, to pass additional options (such as -D definitions) to                                                                                
# the httpd binary at startup, create an override unit (as is done by                                                                                
# systemctl edit) and enter the following:                                                                                                            
                                                                                                                                                     
#       [Service]                                                                                                                                    
#       Environment=OPTIONS=-DMY_DEFINE                                                                                                              
                                                                                                                                                     
[Unit]                                                                                                                                                
Description=The Apache HTTP Server                                                                                                                    
Wants=httpd-init.service                                                                                                                              
After=network.target remote-fs.target nss-lookup.target httpd-init.service                                                                            
Documentation=man:httpd.service(8)                                                                                                                    
                                                                                                                                                     
[Service]                                                                                                                                            
Type=notify                                                                                                                                          
Environment=LANG=C                                                                                                                                    
                                                                                                                                                     
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND                                                                                                      
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful                                                                                                      
# Send SIGWINCH for graceful stop                                                                                                                    
KillSignal=SIGWINCH                                                                                                                                  
KillMode=mixed                                                                                                                                        
PrivateTmp=true                                                                                                                                      
                                                                                                                                                     
[Install]                                                                                                                                            
WantedBy=multi-user.target

httpd.service ユニットファイルは、 network.targetの後にロードする必要があることを明示的に指定しています およびhttpd-init.service (とりわけ)。 systemctl list-units を使用して、これらすべてのサービスを見つけようとしました コマンドを実行し、結果のデータストリームでそれらを検索します。すべてが存在し、ネットワークIPアドレスが設定される前にhttpdサービスがロードされないようにする必要がありました。

最初のソリューション

システム管理者の詳細

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

インターネットで少し検索すると、他の人がhttpdや他のサービスで同様の問題に遭遇したことが確認されました。これは、必要なサービスの1つがsystemdに起動が終了したことを示しているために発生しているように見えますが、実際には、終了していない子プロセスをスピンオフします。もう少し検索した後、私は回避策を思いつきました。

IPアドレスがネットワークインターフェイスカードに割り当てられるのになぜこれほど時間がかかったのか理解できませんでした。そのため、HTTPDサービスの開始を妥当な時間遅らせることができれば、その時間までにIPアドレスが割り当てられると思いました。

幸い、 /lib/systemd/system/httpd.service 上記のファイルはいくつかの方向性を提供します。変更しないように指示されていますが、続行する方法を示しています。コマンド systemctl edit httpdを使用します。 、新しいファイルを自動的に作成します( /etc/systemd/system/httpd.service.d/override.conf )そしてGNUNanoエディタを開きます。 (Nanoに慣れていない場合は、Nanoインターフェイスの下部にあるヒントを確認してください。)

次のテキストを新しいファイルに追加して保存します:

[root@yorktown ~]# cd /etc/systemd/system/httpd.service.d/
[root@yorktown httpd.service.d]# ll
total 4
-rw-r--r-- 1 root root 243 Apr 16 11:43 override.conf
[root@yorktown httpd.service.d]# cat override.conf
# Trying to delay the startup of httpd so that the network is
# fully up and running so that httpd can bind to the correct
# IP address
#
# By David Both, 2020-04-16

[Service]
ExecStartPre=/bin/sleep 30

[サービス] このオーバーライドファイルのセクションには、HTTPDサービスの開始を30秒遅らせる1行が含まれています。次のstatusコマンドは、待機時間中のサービスステータスを表示します。

[root@yorktown ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/httpd.service.d
           └─override.conf
           /usr/lib/systemd/system/httpd.service.d
           └─php-fpm.conf
   Active: activating (start-pre) since Thu 2020-04-16 12:14:29 EDT; 28s ago
     Docs: man:httpd.service(8)
Cntrl PID: 1102 (sleep)
    Tasks: 1 (limit: 38363)
   Memory: 260.0K
      CPU: 2ms
   CGroup: /system.slice/httpd.service
           └─1102 /bin/sleep 30

Apr 16 12:14:29 yorktown.both.org systemd[1]: Starting The Apache HTTP Server...
Apr 16 12:15:01 yorktown.both.org systemd[1]: Started The Apache HTTP Server.
[root@yorktown ~]#

また、このコマンドは、30秒の遅延が経過した後のHTTPDサービスのステータスを表示します。サービスは正常に稼働しています:

[root@yorktown ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/httpd.service.d
           └─override.conf
           /usr/lib/systemd/system/httpd.service.d
           └─php-fpm.conf
   Active: active (running) since Thu 2020-04-16 12:15:01 EDT; 1min 18s ago
     Docs: man:httpd.service(8)
  Process: 1102 ExecStartPre=/bin/sleep 30 (code=exited, status=0/SUCCESS)
 Main PID: 1567 (httpd)
   Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
    Tasks: 213 (limit: 38363)
   Memory: 21.8M
      CPU: 82ms
   CGroup: /system.slice/httpd.service
           ├─1567 /usr/sbin/httpd -DFOREGROUND
           ├─1569 /usr/sbin/httpd -DFOREGROUND
           ├─1570 /usr/sbin/httpd -DFOREGROUND
           ├─1571 /usr/sbin/httpd -DFOREGROUND
           └─1572 /usr/sbin/httpd -DFOREGROUND

Apr 16 12:14:29 yorktown.both.org systemd[1]: Starting The Apache HTTP Server...
Apr 16 12:15:01 yorktown.both.org systemd[1]: Started The Apache HTTP Server.

より短い遅延でも機能するかどうかを実験することもできましたが、私のシステムはそれほど重要ではないため、そうしないことにしました。そのまま確実に動作するので嬉しいです。

このすべての情報を収集したので、RedHatBugzillaにバグ1825554として報告しました。バグについて不満を言うよりも報告する方がはるかに生産的だと思います。

より良いソリューション

これをバグとして報告してから数日後、systemdは単なるマネージャーであり、いくつかの要件が満たされた後にhttpdを注文する必要がある場合は、ユニットファイルで表現する必要があるという応答を受け取りました。応答は私にhttpd.serviceを示しました マニュアルページ。これは私が思いついたものよりも優れた解決策なので、もっと早く見つけていたらよかったのにと思います。このソリューションは、多少ランダムな遅延ではなく、前提条件のターゲットユニットを明示的に対象としています。

httpd.serviceから マニュアルページ:

起動時にサービスを開始する

httpd.serviceユニットとhttpd.socketユニットは無効です デフォルトでは。起動時にhttpdサービスを開始するには、次のコマンドを実行します。 systemctl enable httpd.service 。デフォルトの構成では、httpdデーモンは、構成されたIPv4またはIPv6アドレスのポート80での接続(およびmod_sslがインストールされている場合は、ポート443でのTLS接続)を受け入れます。

httpdが起動時にのみ使用可能になる可能性のある特定のIPアドレスに依存するように構成されている場合(たとえば、「Listen」ディレクティブを使用)、またはhttpdが他のサービス(データベースデーモンなど)に依存している場合、サービス必須 正しい起動順序を保証するように構成されている。

たとえば、構成されたすべてのネットワークインターフェイスが構成された後でのみhttpdが実行されるようにするには、次のセクションでドロップインファイルを作成します(上記のとおり)。

[ユニット]

After =network-online.target

Wants =network-online.target

リッスンを使用することは(少なくとも私の経験では)非常に一般的であるため、これはまだバグだと思います。 httpd.confのディレクティブ 構成ファイル。私はいつも聞くを使ってきました ディレクティブは、単一のIPアドレスしかないホストでも、複数のネットワークインターフェイスカード(NIC)とインターネットプロトコル(IP)アドレスを持つホストで明らかに必要です。上記の行を/usr/lib/systemd/system/httpd.serviceに追加します デフォルトのファイルは、リッスンを使用しない構成では問題を引き起こしません。 ディレクティブであり、そうする人にとってはこの問題を防ぐでしょう。

それまでの間、提案された解決策を使用します。

次のステップ

この記事では、サーバーでApacheHTTPDサービスを開始する際に発生した問題について説明します。それは私が取った問題決定ステップを通してあなたを導き、私がどのようにsystemdを使って支援したかを示しています。また、systemdを使用して実装した回避策と、バグレポートから得られたより優れたソリューションについても説明しました。

冒頭で述べたように、これはsystemdの問題、特にhttpdの起動の構成の結果である可能性が非常に高いです。それにもかかわらず、systemdは、問題の考えられる原因を特定し、回避策を策定して実装するためのツールを提供してくれました。どちらの解決策も、私の満足のいく問題を実際には解決しません。今のところ、問題の根本的な原因はまだ存在しており、修正する必要があります。それが単に推奨行を/usr/lib/systemd/system/httpd.serviceに追加している場合 ファイル、それは私のために働くでしょう。

この間に私が発見したことの1つは、プロセスであり、物事が始まるシーケンスの定義についてさらに学ぶ必要があるということです。これについては、次の記事、このシリーズの5番目で説明します。

リソース

インターネット上にはsystemdに関する多くの情報がありますが、その多くは簡潔で、鈍感で、誤解を招くものですらあります。この記事に記載されているリソースに加えて、次のWebページでは、systemdの起動に関するより詳細で信頼性の高い情報を提供しています。

  • Fedora Projectには、systemdに関する優れた実用的なガイドがあります。 systemdを使用してFedoraコンピューターを構成、管理、および保守するために知っておく必要のあるほとんどすべてが含まれています。
  • Fedora Projectには、古いSystemVコマンドを同等のsystemdコマンドと相互参照する優れたチートシートもあります。
  • systemdの詳細な技術情報とその作成理由については、Freedesktop.orgのsystemdの説明をご覧ください。
  • Linux.comの「Moresystemdfun」は、より高度なsystemd情報とヒントを提供します。

また、systemdの設計者であり主要な開発者であるLennart Poetteringによる、Linuxシステム管理者向けの一連の詳細な技術記事もあります。これらの記事は2010年4月から2011年9月の間に書かれましたが、当時と同じように関連性があります。 systemdとそのエコシステムについて書かれた他のすべての優れた点の多くは、これらの論文に基づいています。

  • PID1を再考する
  • 管理者向けsystemd、パートI
  • 管理者向けsystemd、パートII
  • 管理者向けsystemd、パートIII
  • 管理者向けsystemd、パートIV
  • 管理者向けsystemd、パートV
  • 管理者向けsystemd、パートVI
  • 管理者向けsystemd、パートVII
  • 管理者向けsystemd、パートVIII
  • 管理者向けsystemd、パートIX
  • 管理者向けsystemd、パートX
  • 管理者向けsystemd、パートXI

Linux
  1. 使い始める5つのLinuxコマンド

  2. SystemdサービスはNodejsを起動しませんか?

  3. systemd Linux ディストリビューションで MySQL が systemctl の使用を開始できない

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

  2. systemd:起動直後の SIGTERM

  3. Nginx が systemctl の使用を開始しない

  1. systemdジャーナルを使用した一時的な問題のトラブルシューティング

  2. systemctlコマンドを使用してsystemdユニットを管理する

  3. LinuxでプロのようにGNOMEスクリーンショットツールを使用する