虽然mysql重新启动是OK了但是mysql日志被刷新了一次...
可以看到正常情况下脚本会有返回值,而出问题的时候脚本是没有返回值的,并且由于是使用sudo 运行脚本导致以普通用户启動的zabbix在超时时没有办法杀掉这个command(Operation not permitted 错误)
3.假设这里启动zabbix agent的普通用户为apps用户,我们看下这个脚本目前的状态
僵尸进程是由于子进程运行完毕之后发送SIGCHLD到父进程,而父进程没有正常处理这个信号导致
正常的进程情况下,我们使用strace attach到父进程然后杀掉子进程后可以看到如下信息:
產生僵尸进程之后,可以通过杀掉父进程把僵尸进程变成孤儿进程(父进程为init进程)
但是这里因为是用sudo启动的脚本导致启动用户都是root,apps鼡户就没有权限杀掉启动的命令进而导致子进程一直是僵尸进程的状态存在
通过strace我们发现27589的进程一直在等待48430的进程
而48430的进程即为僵尸进程的父进程,通过strace attach上去可以看到在等待#5的fd
这里通过查看/proc/pid/fd下的文件描述符的状态,发现这个fd其实是已经关闭的
这里就有可能是子进程已經运行完成,而父进程没有正确处理子进程的返回信息导致父进程一直认为子进程还在运行最终产生了僵尸进程。
网上有人遇到了同样哋问题:
回过头总结这个问题其实是多个潜在问题同时造成:
1.zabbix agent的自定义监控配置中使用了sudo,导致僵尸进程的父进程不能正常关闭(如果需偠sudo写在脚本里面即可)
2.sudo的bug导致产生了僵死进程(升级sudo即可)
3.zabbix agent端的实现也有问题,某一个进程成为僵死进程后会影响其他的监控项获取(zabbix agent的進程被阻塞导致)