Acabei de atualizar do CentOS 6.5 para 7.0 e não estou muito feliz porque o novo systemd
provavelmente está me causando problemas. Parece que está simplesmente inicializando muito rápido, iniciando processos de forma assíncrona e danificando as dependências de serviço.
Por exemplo, tenho alguns scripts de configuração nos crond
quais são acionados após uma reinicialização:
@reboot /root/scripts/check_gmail.sh
@reboot /root/scripts/start_gps_listener.sh
Isso resulta em todos os tipos de erros estranhos (mostrando apenas um deles):
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)
Acima, estou escrevendo em um soquete TCP. É bastante claro para mim que crond
é iniciado antes da rede ser inicializada corretamente como o network is unreachable
.
O mesmo acontece com o Apache e o MySQL (MariaDB). O MySQL é bastante lento para iniciar (muitos dados), o que significa que o Apache e muitos dos meus crond
scripts de inicialização estão falhando, pois o banco de dados MySQL não está sendo executado quando os scripts estão sendo chamados.
Eu tentei configurar dependências, mas sem sorte; Anexei network
e mysql
serviços para [Unit]
(como visto com systemctl list-dependencies
). Idealmente, todos os serviços esperam até que o MySQL esteja em funcionamento:
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
Ao inicializar com o descrito acima, recebo os mesmos erros. Também recebo os emails, mailq
pois a rede / DNS não está pronta ao processar scripts cron. Alguns minutos após a inicialização, eles são enviados corretamente.
Alguém pode ajudar a acertar isso certificando-se de que os serviços sejam disparados na ordem correta? Parece muito errado que ele seja inicializado tão rapidamente e, idealmente, foi feito da maneira antiga ", lançando um serviço ... espere ... inicie um novo serviço ... espere ... e assim por diante).
Observe que não tenho certeza se systemd
esse é o meu problema - é apenas minha teoria do que posso ler da rede.
grep -i concurrency /etc/default/rcS
? Eu posso estar misturando meus sistemas init, mas me lembro que controla se os processos esperam um pelo outro terminar./etc/default/rc*
Requires=network.target
às unidades acima.Requires=network.target
em/lib/systemd/system/crond.service
Respostas:
Depois de muito mais leitura, encontrei a solução que funciona para mim.
Li este guia, Executando serviços depois que a rede estiver ativa . Uma pequena citação do guia:
Isso é exatamente o que eu queria, então ativei esse serviço e configurei a regra de dependência no arquivo de serviço para
crond
:Como
mysqld
ainda é baseado no antigo queinit.d
eu precisava para criar umsystemd
serviço, conforme sugerido aqui, o systemctl enable difere do systemctl start :E, finalmente, configure o serviço Apache para iniciar após o MySQL:
Isso funciona para mim, pelo menos.
Eu usei esses comandos para verificá-lo posteriormente, onde eu posso ver claramente que a rede foi iniciada antes de pelo menos o MySQL e o Apache. Embora eu não consiga ver o
crond
lugar, mas posso ver que está funcionando nos meus scripts:Alguns outros comandos úteis que usei são:
Se alguém puder ver uma maneira melhor de fazer isso, compartilhe.
fonte
systemd-analyze critical-chain
. Não apenas vou usá-lo com frequência, mas de repente sou vendidosystemd
. Obrigado!