Ich habe gerade ein Upgrade von CentOS 6.5 auf 7.0 durchgeführt und bin nicht sehr glücklich, da das neue systemd
mir wahrscheinlich Probleme bereitet. Es scheint, als würde es einfach zu schnell booten, Prozesse asynchron starten und Dienstabhängigkeiten vermasseln.
Zum Beispiel habe ich einige Skripte eingerichtet, crond
die nach einem Neustart ausgelöst werden:
@reboot /root/scripts/check_gmail.sh
@reboot /root/scripts/start_gps_listener.sh
Dies führt zu allen möglichen seltsamen Fehlern (von denen nur einer angezeigt wird):
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)
Oben schreibe ich an einen TCP-Socket. Mir ist ziemlich klar, dass crond
es gestartet wird, bevor das Netzwerk ordnungsgemäß als das initialisiert wird network is unreachable
.
Das gleiche gilt für Apache und MySQL (MariaDB). MySQL startet nur sehr langsam (viele Daten), was bedeutet, dass sowohl Apache als auch viele meiner crond
Startskripte fehlschlagen, da die MySQL-Datenbank beim Aufrufen der Skripte nicht ausgeführt wird.
Ich habe versucht, Abhängigkeiten einzurichten, aber ohne Glück; Ich habe angehängt network
und mysql
Dienstleistungen an [Unit]
(wie mit gesehen systemctl list-dependencies
). Im Idealfall warten alle Dienste, bis MySQL betriebsbereit ist:
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
Beim Booten mit den oben genannten bekomme ich die gleichen Fehler. Ich erhalte auch die E-Mails, mailq
da das Netzwerk / DNS bei der Verarbeitung von Cron-Skripten nicht bereit ist. Einige Minuten nach dem Start werden sie korrekt gesendet.
Kann jemand helfen, dies richtig zu machen, indem er sicherstellt, dass die Dienste in der richtigen Reihenfolge ausgelöst werden? Es scheint sehr falsch zu sein, dass es so schnell bootet und im Idealfall auf die gute alte Art und Weise "einen Dienst starten ... warten ... einen neuen Dienst starten ... warten ... so weiter").
Beachten Sie, dass ich nicht sicher bin, ob dies systemd
mein Problem ist - es ist nur meine Theorie dessen, was ich aus dem Netz lesen kann.
grep -i concurrency /etc/default/rcS
? Ich vermische vielleicht meine Init-Systeme, aber ich erinnere mich, dass dies steuert, ob Prozesse aufeinander warten, bis sie abgeschlossen sind./etc/default/rc*
Requires=network.target
, die oben genannten Einheiten zu ergänzen.Requires=network.target
in/lib/systemd/system/crond.service
Antworten:
Nach viel mehr Lesen fand ich die Lösung, die für mich funktioniert.
Ich habe dieses Handbuch gelesen: Ausführen von Diensten, nachdem das Netzwerk aktiv ist . Ein kleines Zitat aus dem Leitfaden:
Dies ist genau das, was ich wollte, also habe ich diesen Dienst aktiviert und die Abhängigkeitsregel in der Dienstdatei festgelegt für
crond
:Da
mysqld
es immer noch auf dem alten basiert, dasinit.d
ich zum Erstellen einessystemd
Dienstes benötigt habe, wie hier vorgeschlagen, unterscheidet sich systemctl enable vom systemctl start :Und schließlich den Apache-Dienst so einrichten, dass er nach MySQL gestartet wird:
Das funktioniert zumindest bei mir.
Ich habe diese Befehle verwendet, um es anschließend zu überprüfen, wo ich deutlich sehen kann, dass das Netzwerk vor mindestens MySQL und Apache gestartet wurde. Ich kann das zwar
crond
nirgendwo sehen, aber ich kann sehen, dass es in meinen Skripten funktioniert:Einige andere nützliche Befehle, die ich verwendet habe, sind:
Wenn jemand einen besseren Weg sieht, dies zu tun, dann teile es bitte mit.
quelle
systemd-analyze critical-chain
. Ich werde das nicht nur oft benutzen, sondern bin plötzlich weiterverkauftsystemd
. Vielen Dank!