CentOS 7が起動しすぎてcronスクリプトを実行したときにネットワークが準備されていません。

CentOS 7が起動しすぎてcronスクリプトを実行したときにネットワークが準備されていません。

systemd私はCentOS 6.5から7.0にアップグレードしましたが、新しいバージョンが私に問題を引き起こす可能性があるため、あまり満足できません。これはあまりにも早く始まり、プロセスを非同期的に開始し、サービスの依存関係をめちゃくちゃにするようです。

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と多くの起動スクリプトが失敗することを意味します。

私は接続したサービスnetworkと成功せずに依存関係を設定してみました。理想的には、すべてのサービスはMySQLが実行されるのを待ちます。mysql[Unit]systemctl list-dependencies

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が準備されていないため、電子メールも届きました。起動後数分後に正しく送信されます。

サービスが正しい順序で開始されていることを確認してこの問題を解決するのに役立つ人はいますか?早すぎるのはとても間違っているようです。理想的には、「サービスの開始...ちょっと...新しいサービスの開始...ちょっと...その他」のような昔ながらの方法で行うことをお勧めします。

これが私の問題かどうかはわかりませんsystemd。オンラインで読んだ理論だけです。

答え1

たくさんの本を読んだ後、私に合った解決策を見つけました。

私はこのガイドを読んで、ネットワーク接続後のサービスの実行。ガイドの小さな引用:

これにより、開始前に構成されたすべてのネットワークデバイスが起動され、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ばならないが、systemdsystemctlの有効化はsystemctl startとは異なります。:

[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

最後に、Apacheサービスが起動するように設定します。後ろにMySQL:

[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

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

関連情報