Acabo de actualizar de CentOS 6.5 a 7.0 y no estoy muy contento ya que la nueva systemd
probablemente me está dando problemas. Parece que simplemente se está iniciando demasiado rápido, iniciando los procesos de forma asincrónica y arruinando las dependencias del servicio.
Por ejemplo, tengo algunas configuraciones de scripts crond
que se activan después de un reinicio:
@reboot /root/scripts/check_gmail.sh
@reboot /root/scripts/start_gps_listener.sh
Esto da como resultado todo tipo de errores extraños (solo muestra uno de ellos):
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)
En lo anterior, estoy escribiendo en un socket TCP. Para mí es bastante claro que crond
se inicia antes de que la red se inicialice correctamente como network is unreachable
.
Lo mismo ocurre con Apache y MySQL (MariaDB). MySQL es bastante lento para el inicio (muchos datos), lo que significa que tanto Apache como muchos de mis crond
scripts de inicio están fallando ya que la base de datos MySQL no se está ejecutando cuando se llaman los scripts.
He intentado configurar dependencias pero sin suerte; He agregado network
y mysql
servicios a [Unit]
(como se ve con systemctl list-dependencies
). Idealmente, todos los servicios esperan hasta que MySQL esté en funcionamiento:
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
Al arrancar con lo anterior, obtengo los mismos errores. También recibo los correos electrónicos mailq
ya que la red / DNS no está lista al procesar cron-scripts. Unos minutos después del inicio, se envían correctamente.
¿Alguien puede ayudar a hacer esto bien asegurándose de que los servicios se activen en el orden correcto? Parece muy incorrecto que sea un arranque tan rápido e idealmente lo hizo de la manera tradicional, "lanzando un servicio ... espera ... lanzando un nuevo servicio ... espera ... etc.".
Tenga en cuenta que no estoy seguro de que systemd
ese sea mi problema, es solo mi teoría de lo que puedo leer de la red.
grep -i concurrency /etc/default/rcS
? Puede que esté mezclando mis sistemas de inicio, pero parece recordar que controla si los procesos esperan el uno al otro para terminar./etc/default/rc*
Requires=network.target
a las unidades de arriba.Requires=network.target
en/lib/systemd/system/crond.service
Respuestas:
Después de leer mucho más, encontré la solución que me funciona.
Leí esta guía, Servicios en ejecución después de que la red esté activa . Una pequeña cita de la guía:
Esto es exactamente lo que quería, así que habilité este servicio y configuré una regla de dependencia en el archivo de servicio para
crond
:Como
mysqld
todavía se basa en lo antiguoinit.d
que necesitaba para crear unsystemd
servicio como se sugiere aquí, systemctl enable difiere de systemctl start :Y finalmente configure el servicio Apache para iniciar después de MySQL:
Esto funciona para mí al menos.
He usado estos comandos para verificarlo luego, donde claramente puedo ver que la red se inicia antes de al menos MySQL y Apache. Aunque no puedo ver el
crond
sitio, pero puedo ver que funciona en mis scripts:Algunos otros comandos útiles que utilicé son:
Si alguien puede ver una mejor manera de hacer esto, por favor comparta.
fuente
systemd-analyze critical-chain
. No solo voy a usar eso a menudo, sino que de repente me vendensystemd
. ¡Gracias!