CentOS 7の起動が速すぎて、cronスクリプトの実行時にネットワークの準備ができていません


9

CentOS 6.5から7.0にアップグレードしたばかりですsystemdが、おそらく新しいもので問題が発生しているので、あまり満足していません。それは単に起動が速すぎて、プロセスを非同期に起動し、サービスの依存関係を台無しにしているだけのようです。

たとえばcrond、再起動後にトリガーされるいくつかのスクリプトのセットアップがあります。

@reboot    /root/scripts/check_gmail.sh
@reboot    /root/scripts/start_gps_listener.sh

これにより、あらゆる種類の奇妙なエラーが発生します(そのうちの1つだけが表示されます)。

Warning: stream_socket_client(): unable to connect to tcp://192.168.20.4:4001 
  (Network is unreachable) in /root/scripts/check_gmail.php on line 137
  ERROR: Network is unreachable (101)

上記では、TCPソケットに書き込んでいます。crondネットワークがとして正しく初期化される前に開始されることは、私にはかなり明らかですnetwork is unreachable

ApacheとMySQL(MariaDB)でも同じことが言えます。MySQLの起動は非常に遅い(大量のデータ)つまりcrond、スクリプトが呼び出されているときにMySQLデータベースが実行されていないため、Apacheと多くの起動スクリプトの両方が失敗しています。

依存関係をセットアップしようとしましたが、運がありませんでした。にサービスを追加networkmysqlました[Unit](で確認できますsystemctl list-dependencies)。理想的には、すべてのサービスはMySQLが稼働するまで待機します。

vi /lib/systemd/system/httpd.service
  [Unit]
  Description=The Apache HTTP Server
  After=network.target remote-fs.target nss-lookup.target network.service mysql.service

vi /lib/systemd/system/crond.service
  [Unit]
  Description=Command Scheduler
  After=syslog.target auditd.service systemd-user-sessions.service time-sync.target network.service mysql.service

上記で起動すると、同じエラーが発生します。mailqcronスクリプトの処理時にネットワーク/ DNSの準備ができていないため、メールも受信します。起動後数分で正しく送信されます。

誰もがサービスが正しい順序で起動されることを確認することによってこれを正しくするのを助けることができますか?それが非常に高速なブートであり、理想的には古き良き方法であることが非常に間違っているようです。「1つのサービスを起動しています...

systemdそれが私の問題であるかどうかはわかりませんが、これはネットから読み取れるものについての私の理論にすぎません。


の出力を投稿できますgrep -i concurrency /etc/default/rcSか?私はinitシステムを混同しているかもしれませんが、プロセスがお互いに終了するのを待つかどうかを制御することを思い出したようです。
terdon

次のファイルはありません/etc/default/rc*
DHS

申し訳ありませんが、CentOSと同等の場所がわかりません。サービスが並行して開始されるようにするために、ここでDebian について説明していることを考えていました。あなたの場合、似たようなセットがあるかもしれません。
terdon

2
Requires=network.target上記のユニットに追加してみてください。
ケーシー2014年

挿入された後も同じ問題Requires=network.targetにして/lib/systemd/system/crond.service
DHS

回答:


9

もっとたくさん読んだ後、私は自分に役立つ解決策を見つけました。

このガイドの「ネットワークが稼働した後のサービスの実行」を読みました。ガイドからの少しの引用:

これにより、構成されたすべてのネットワークデバイスが起動し、起動を続行する前にIPアドレスが割り当てられます。

これはまさに私が欲しかったものなので、このサービスを有効にし、サービスファイルに依存関係ルールを設定しましたcrond

[root@srv]# systemctl enable NetworkManager-wait-online

[root@srv]# vi /lib/systemd/system/crond.service
  Requires=network.target
  After=syslog.target auditd.service systemd-user-sessions.service time-sync.target network.target mysqld.service

mysqldまだ古いに基づいてinit.d作成するのに必要なI systemdここで提案としてサービスを、systemctl開始から異なっを有効systemctl

[root@srv]# vi /lib/systemd/system/mysqld.service
  [Unit]
  Description=MySQL Server
  After=network.target
  [Service]
  Type=forking
  ExecStart=/etc/rc.d/init.d/mysql start
  ExecStop=/etc/rc.d/init.d/mysql stop
  [Install]
  WantedBy=multi-user.target

[root@srv]# systemctl daemon-reload
[root@srv]# chkconfig mysql off
[root@srv]# systemctl enable mysqld

最後に MySQLのに起動するようにApacheサービスを設定します。

[root@srv]# vi /lib/systemd/system/httpd.service
  Requires=mysqld.service
  After=network.target remote-fs.target nss-lookup.target mysqld.service

これは少なくとも私にとってはうまくいきます。

私はこれらのコマンドを使用して後で確認しましたが、少なくともMySQLとApacheの前にネットワークが起動されていることがはっきりとわかります。私はcrondどこを見ることもできませんが、スクリプトで機能していることがわかります。

[root@srv]# systemd-analyze critical-chain
  multi-user.target @10.510s
    + httpd.service @10.344s +165ms
      + mysqld.service @9.277s +1.065s
        + network.target @9.273s
          + network.service @8.917s +355ms
            + iptables.service @444ms +157ms
              + basic.target @443ms
                [CUT]

私が使用した他のいくつかの便利なコマンドは次のとおりです。

# See exactly what takes how long (who to blame for the delay)
[root@srv]# systemd-analyze blame

# Check available names that can be used in the service files
[root@srv]# systemctl list-unit-files

これを行うためのより良い方法を誰かが見ることができる場合は、共有してください。


これをデバッグするために使用したコマンドをポストするための+1。私はの問題の本当に厄介な結び目を解決することができましたsystemd-analyze critical-chain。よく使うだけでなく、突然売れてしまいましたsystemd。ありがとう!
ブライアントッピング2017年

配布パッケージマネージャーによって管理されているサービスファイルは変更しないでください。代わりに、ドロップイン構成ファイルを使用することをお勧めします。systemdサービスをオーバーライドまたは構成
Ludovic Ronsin 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.