介绍
昨天同事向我反馈了个问题,说在CentOS 7系统上crond服务的日志有报错,让我协助看看。我排查后发现造成此问题的原因可能很普遍,就将排查和解决的步骤记录下来了,方便后续参考。
注意,以下步骤及截图全部来源于我的本地虚拟机。
环境信息
- CentOS 7操作系统
- 部署有MySQL数据库
排查
1、排查cron日志文件
在登录到CentOS操作系统后,我首先去查看crond服务的日志文件,确认详细的报错信息。crond服务的默认日志文件是/var/log/cron,由于我这边没做特殊调整,就直接查看此文件即可。如果有特殊原因,修改了默认存储位置,则根据实际位置查询。
[root@localhost ~]# vim /var/log/cron
报错信息如下:
从上图中可以看到,我的crond服务在17点01分01秒执行了/root/test.sh脚本,执行后就报错了。
2、检查Postfix服务状态
从上面得到的错误信息是“MAIL (mailed 8 bytes of output but got status 0x007f#012)”,翻译过来就是邮寄了8字节的输出信息,但得到的状态是0x007f#012。
看过错误后,我怀疑是postfix服务出现了问题,就去检查postfix服务的状态。
[root@localhost ~]# systemctl status postfix
服务状态如下图:
从上图看到,的确跟我想的一样,postfix服务启动失败了。由于窗口显示的错误信息太少,所以我就将输出重定向个临时文件。
[root@localhost ~]# systemctl status postfix > temp.log
再次查看temp.log文件。
[root@localhost ~]# vim temp.log
完整错误信息如下图:
从图中已经确定问题,报错的原因是找不到共享链接库“libmysqlclient.so.18”。
3、再次确定链接库是否存在
虽然已经看到提示是找不到共享链接库,但是我们还是需要再确定一下链接库是不是真的不存在。因为有时候共享链接库找不到并不是因为不存在,而是软链接配置错误或者其他配置错误导致的。
[root@localhost ~]# find / -name libmysqlclient.so.18
排查后发现的确是没有共享链接库文件。
解决
1、查找共享链接库的提供者
既然我们已经知道postfix服务启动失败是因为“libmysqlclient.so.18”这个共享链接库找不到造成的,那就可以使用命令查询postfix需要的共享链接库,以及共享链接库的提供者。
[root@localhost ~]# yum deplist postfix
从上图中看到,“libmysqlclient.so.18”这个动态链接库的提供者有两个,一个是mariadb-libs包,另一个是mysql-community-libs-compat包。这两个包一个是mariadb数据库的,一个是mysql数据库的,并且这两个在同一个操作系统上不能共存。CentOS 7默认是mariadb数据库,libs包自然也就是mariadb-libs。假如我们需要安装MySQL数据库,那么肯定会先卸载这个依赖,然后安装mysql的mysql-community-libs-compat依赖。但这里有个问题,安装mysql又不是必须要安装mysql-community-libs-compat依赖,就可能会造成此问题。
2、检查依赖包
获取到共享链接库的依赖名后,我们在当前系统上检查下这两个包是否存在即可。
[root@localhost ~]# rpm -qa | grep mysql-community-libs-compat
[root@localhost ~]# rpm -qa | grep mariadb-libs
从查询结果来看,没有任何输出,即表示这两个依赖都没有安装。
3、选择依赖
既然这两个依赖都没有安装,那么我就需要选择其中一个来进行安装。如果你的服务器上运行的是mariadb数据库,则你就安装mariadb-libs包;反之,则安装mysql-community-libs-compat包。
注意,如果你的mysql是使用编译安装的,则必须检查目录才能确定mysql是否安装。
[root@localhost ~]# rpm -qa | grep mariadb
[root@localhost ~]# rpm -qa | grep mysql
从查询的结果来看,我这里是安装的mysql数据库,所以需要安装mysql-community-libs-compat。
4、安装依赖
如果你的服务器能够访问外网,则直接安装即可,yum会自动匹配你的mysql版本;如果无法访问外网,则需要手动下载rpm包,下载对应mysql版本的依赖包后,上传到服务器安装即可。我这里推荐使用此网站下载依赖:依赖下载地址
[root@localhost ~]# yum install mysql-community-libs-compat
从图中我们能够看到,安装依赖时,也会提示你postfix需要此依赖。
5、重启postfix服务
我们安装完成依赖后,还需要重启postfix服务才行。
[root@localhost ~]# systemctl restart postfix
6、再次查看postfix服务
重启完postfix服务后,我们再次检查服务的运行状态。
[root@localhost ~]# systemctl status postfix
从图中可以看到,邮件服务已经正常运行了。
评论区