我刚刚从 CentOS 6.5 升级到 7.0,我不太高兴,因为新版本systemd
可能给我带来了问题。似乎只是启动太快,异步启动进程并搞砸了服务依赖项。
例如,我有一些脚本设置,crond
在重启后触发:
@reboot /root/scripts/check_gmail.sh
@reboot /root/scripts/start_gps_listener.sh
Run Code Online (Sandbox Code Playgroud)
这会导致各种奇怪的错误(仅显示其中一个):
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)
Run Code Online (Sandbox Code Playgroud)
在上面我写到一个 TCP 套接字。我很清楚这crond
是在网络正确初始化为network is unreachable
.
Apache 和 MySQL (MariaDB) 也是如此。MySQL 启动很慢(大量数据),这意味着 Apache 和我的许多crond
启动脚本都失败了,因为在调用脚本时 MySQL 数据库没有运行。
我试图设置依赖项,但没有任何运气;我已将network
和mysql
服务附加到[Unit]
(如 所见systemctl list-dependencies
)。理想情况下,所有服务都会等到 MySQL 启动并运行:
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
Run Code Online (Sandbox Code Playgroud)
使用上述内容启动时,我遇到了相同的错误。我也收到了电子邮件,mailq
因为在处理 cron 脚本时网络/DNS 尚未准备好。启动几分钟后,它们被正确发送。
任何人都可以通过确保以正确的顺序触发服务来帮助做到这一点吗?它的启动速度如此之快似乎是非常错误的,理想情况下,它以旧的方式做到了,“启动一个服务......等等......启动一个新服务......等等......等等)。
请注意,我不确定这是systemd
我的问题 - 这只是我可以从网上读取的内容的理论。
Bea*_*ais 10
经过大量阅读后,我找到了适合我的解决方案。
我阅读了本指南,在网络启动后运行服务。指南中的一点引述:
这将确保所有配置的网络设备都已启动并在引导继续之前分配了 IP 地址。
这正是我想要的,所以我启用了这个服务并在服务文件中设置了一个依赖规则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
Run Code Online (Sandbox Code Playgroud)
由于mysqld
仍然基于旧的,init.d
我需要systemd
按照此处的建议创建服务,systemctl enable 与 systemctl start 不同:
[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
Run Code Online (Sandbox Code Playgroud)
最后设置 Apache 服务在MySQL之后启动:
[root@srv]# vi /lib/systemd/system/httpd.service
Requires=mysqld.service
After=network.target remote-fs.target nss-lookup.target mysqld.service
Run Code Online (Sandbox Code Playgroud)
这至少对我有用。
我已经使用这些命令在之后检查它,我可以清楚地看到网络至少在 MySQL 和 Apache 之前启动。我虽然看不到crond
任何地方,但我可以看到它在我的脚本中工作:
[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]
Run Code Online (Sandbox Code Playgroud)
我使用的其他几个有用的命令是:
# 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
Run Code Online (Sandbox Code Playgroud)
如果有人可以看到任何更好的方法来做到这一点,那么请分享。
归档时间: |
|
查看次数: |
23321 次 |
最近记录: |