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ソケットに書き込みます。ネットワークがnetwork is unreachable
として適切に初期化される前にcrond
が開始されることは明らかです。
ApacheとMySQL(MariaDB)でも同じことが言えます。 MySQLは起動が非常に遅い(データが多い)ため、Apacheと多くのcrond
起動スクリプトは、スクリプトが呼び出されているときにMySQLデータベースが実行されていないために失敗しています。
依存関係をセットアップしようとしましたが、運がありませんでした。 [Unit]
にnetwork
およびmysql
サービスを追加しました(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
上記で起動すると、同じエラーが発生します。 cronスクリプトの処理時にネットワーク/ DNSの準備ができていないため、mailq
にもメールが届きます。起動後数分で正しく送信されます。
サービスが正しい順序で起動されることを確認することで、これを正しく行うのを手伝ってくれる人はいますか?起動が非常に高速で、理想的には古き良き方法である「1つのサービスを起動する」ことは非常に間違っているようです。 ..待機...新しいサービスを起動しています...待機...など)。
私の問題がsystemd
であるかどうかはわかりませんが、これはネットから読み取れるものについての私の理論にすぎません。
もっとたくさん読んだ後、私は自分に役立つ解決策を見つけました。
私はこのガイドを読みます ネットワークが稼働した後にサービスを実行する 。ガイドからの少しの引用:
これにより、構成されたすべてのネットワークデバイスが起動し、起動を続行する前に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
に基づいているため、ここで提案されているようにsystemd
サービスを作成する必要がありました systemctl enableは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
これを行うためのより良い方法を誰かが見ることができる場合は、共有してください。