Ho appena effettuato l'aggiornamento da CentOS 6.5 a 7.0 e non sono contento perché il nuovo systemd
probabilmente mi sta dando problemi. Sembra che si stia semplicemente avviando troppo velocemente, avviando i processi in modo asincrono e rovinando le dipendenze del servizio.
Ad esempio ho alcune impostazioni di script in crond
cui vengono attivate dopo un riavvio:
@reboot /root/scripts/check_gmail.sh
@reboot /root/scripts/start_gps_listener.sh
Ciò si traduce in tutti i tipi di strani errori (mostrandone solo uno):
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)
In quanto sopra sto scrivendo su un socket TCP. È abbastanza chiaro per me che crond
viene avviato prima che la rete venga inizializzata correttamente come network is unreachable
.
La stessa cosa vale per Apache e MySQL (MariaDB). MySQL è piuttosto lento all'avvio (molti dati), il che significa che sia Apache che molti dei miei crond
script di avvio non funzionano poiché il database MySQL non è in esecuzione quando vengono chiamati gli script.
Ho provato a configurare le dipendenze ma senza fortuna; Ho aggiunto network
e mysql
servizi a [Unit]
(come visto con systemctl list-dependencies
). Idealmente tutti i servizi attendono che MySQL sia attivo e funzionante:
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
Quando si avvia con quanto sopra ottengo gli stessi errori. Ricevo anche le e-mail in mailq
quanto la rete / DNS non è pronta durante l'elaborazione dei cron-script. Pochi minuti dopo l'avvio vengono inviati correttamente.
Qualcuno può aiutare a farlo bene assicurandosi che i servizi siano attivati nell'ordine corretto? Sembra molto sbagliato che si avvii così velocemente e idealmente lo ha fatto alla vecchia maniera, "lanciando un servizio ... aspetta ... lanciando un nuovo servizio ... aspetta ... ecc.).
Nota che non sono sicuro che sia systemd
questo il mio problema: è solo la mia teoria di ciò che posso leggere dalla rete.
/etc/default/rc*
Requires=network.target
alle unità sopra.
Requires=network.target
in/lib/systemd/system/crond.service
grep -i concurrency /etc/default/rcS
? Potrei confondere i miei sistemi di inizializzazione, ma mi sembra di ricordare che controlla se i processi aspettano che finiscano l'un l'altro.