CentOS 7 çok hızlı önyükleme yapıyor ve cron komut dosyalarını yürütürken ağ hazır değil


9

CentOS 6.5'ten 7.0'a yükselttim ve yeni systemdmuhtemelen bana problemler verdiği için çok mutlu değilim . Sadece çok hızlı bir şekilde önyükleme, süreçleri eşzamansız olarak başlatma ve hizmet bağımlılıklarını azaltma gibi görünüyor.

Örneğin crond, bir yeniden başlatmadan sonra tetiklenen birkaç komut dosyası kurulum var :

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

Bu, her türlü garip hataya neden olur (sadece birini gösterir):

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)

Yukarıda bir TCP soketine yazıyorum. crondAğın doğru şekilde başlatılmasından önce başlatılan benim için oldukça açık network is unreachable.

Aynı şey Apache ve MySQL (MariaDB) için de geçerli. MySQL'in başlatılması oldukça yavaştır (çok fazla veri), yani crondkomut dosyaları çağrıldığında MySQL veritabanı çalışmadığından hem Apache'nin hem de başlangıç ​​komut dosyalarının çoğunun başarısız olduğu anlamına gelir .

Bağımlılık kurmaya çalıştım ama hiç şansım yoktu; Ben ekledim networkve mysqlhizmetleri [Unit](ile görüldüğü gibi systemctl list-dependencies). İdeal olarak tüm hizmetler MySQL çalışana kadar bekler:

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

Yukarıdaki ile önyükleme yaparken aynı hataları alıyorum. Ayrıca e-postaları alıyorummailq cron komut dosyalarını işlerken ağ / DNS hazır olmadığından . Başlangıçtan birkaç dakika sonra doğru şekilde gönderilirler.

Hizmetlerin doğru sırayla işlenmesini sağlayarak kimse bu hakkın elde edilmesine yardımcı olabilir mi?Bu çok hızlı bir şekilde önyükleme yapmak gibi görünüyor ve ideal olarak iyi eski bir yol yaptı, "bir serice başlatmak ... bekle ... yeni bir hizmet başlatmak ... bekle ... böyle).

Bunun systemdbenim sorunum olduğundan emin olmadığımı unutmayın - sadece internetten ne okuyabileceğim konusunda benim teorim.


Çıktısını gönderebilir misiniz grep -i concurrency /etc/default/rcS? Başlangıç ​​sistemlerimi karıştırıyor olabilirim ama süreçlerin birbirinin bitmesini bekleyip beklemediğini kontrol ettiğini hatırlıyorum.
terdon

/etc/default/rc*
DHS

Maalesef, CentOS eşdeğerinin nerede olacağını bilmiyorum. Burada hizmetlerin paralel olarak başlatılmasını sağlayan Debian için nelerin tanımlandığını düşünüyordum . Davanızda benzer bir şey olabilir.
terdon

2
Requires=network.targetYukarıdaki birimlere eklemeyi deneyin .
casey

Konulduktan sonra hala aynı sorun Requires=network.targetiçin/lib/systemd/system/crond.service
DHS

Yanıtlar:


10

Çok daha fazla okumadan sonra benim için işe yarayan çözümü buldum.

Ağ kurulduktan sonra Hizmetleri Çalıştırma bu kılavuzu okudum . Rehberden küçük bir alıntı:

Bu, tüm yapılandırılmış ağ aygıtlarının çalışır durumda olmasını ve önyükleme devam etmeden önce bir IP adresinin atanmasını sağlar.

Bu tam olarak ne istediğini bu yüzden bu hizmeti etkinleştirdi ve hizmet dosyasında bir bağımlılık kuralı ayarlayın 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

Gibi mysqldhala eski dayanmaktadır init.dbir oluşturmak için gerekli I systemdburada önerildiği gibi hizmet systemctl baştan farklılık sağlayacak 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

Ve son olarak Apache hizmetini MySQL'den sonra başlatılacak şekilde ayarlayın :

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

En azından benim için çalışıyor.

Bu komutları daha sonra ağın en azından MySQL ve Apache'den önce başlatıldığını görebildiğim yerde kontrol etmek için kullandım. Yine de hiçbir crondyerde göremiyorum ama scriptlerimde çalıştığını görebiliyorum:

[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]

Kullandığım diğer birkaç yararlı komut şunlardır:

# 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

Herhangi biri bunu yapmak için daha iyi bir yol görebilir, o zaman lütfen paylaşın.


Hata ayıklamak için kullandığınız komutları göndermek için +1. Sorunları gerçekten kötü bir düğüm çözmek mümkün systemd-analyze critical-chain. Bunu sadece sık sık kullanacak değil, birdenbire satılıyorum systemd. Teşekkürler!
Brian Topping

Dağıtım paketi yöneticiniz tarafından yönetilen hizmet dosyalarını değiştirmemelisiniz. Bunun yerine, açılan yapılandırma dosyalarını kullanmanız daha iyi olur. Cevabını bakın ben geçersiz kılabilir veya yapılandırmak hizmetlerini systemd nasıl?
Ludovic Ronsin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.