问题症状
这是一个蛮悲催的bug问题,directadmin官方帮助文档中有此记载,它会长期占用cpu 100%,且会造成死机。
参详http://help.directadmin.com/item.php?id=402。
https://www.veidc.com/technical/5998.html
而事实上会造成该错误的原因远远不止如此。但总体的解决思路还是一致的。
原因检查
我们可以通过dataskq的错误日志,来看看具体发生过什么。执行以下命令行,读取最后50行日志dataskq错误日志。
代码语言:javascript复制tail -n 50 /var/log/directadmin/errortaskq.log
- 到目前为止本人发现已有多种错误日志内容记录。例如如下:
2016:01:11-20:31:18: Ticket::deliverMessage::Can’t read ./data/admin/tickets.list: Unable to get Lock on file:file is locked by another process
- 该问题的原因通常是directadmin面板中的message system里的邮件ticket太多了。导致无法正常读取。
2016:01:06-20:04:01: Username administrator is 13 characters long, but the directadmin.conf has this setting ‘max_username_length=10’
- 该问题的原因是用户命名大于13个字符,而默认只允许10个字符以内。虽然也可以修改/usr/local/directadmin/conf/directadmin.conf文件的max_username_length值,但最大也只能设置为14个字符,因此还是在创建用户名字的时候就规避比较好。
2016:02:05-14:14:37: ConfigFile::writeFile(./data/admin/brute_user.data) : Timestamp from when it was read is different, overwriting anyway
解决方法
知道了具体问题原因,那么即使不能完全杜绝,但至少也可以尽量去避免和优化。下面就说说针对这类问题如何处理。
① 首先,如果还未死机,但是已知dataskq占用cpu100%,那么就先将以下命令步骤操作。 在SSH中执行如下命令行;
代码语言:javascript复制killall dataskq
> /usr/local/directadmin/data/admin/brute_log_entries.list
sed -i 's/root /usr/root nice -n 19 /usr/g' /etc/cron.d/directadmin_cron
以上命令行的作用是,结束掉当前的dataskq进程,将/usr/local/directadmin/data/admin/brute_log_entries.list内容清空,并将datasqk的优先级调低。 /usr/local/directadmin/data/admin/brute_log_entries.list 该文件保存了主机的登录日志,包括登录成功或失败的所有纪录,由于全球网络环境并不那么清净,有大量的肉机无时无刻不在扫描破解攻击任意ip,因此可能有大量的记录保存在该文件内,而该文件是属于文本文件,长时间未清理,该文件会变的很大,一个很大的文本文件如果被打开,是非常占用资源的。因此及时对其清理。
② 引发该问题的大部分情况都是硬盘占用大量IO读写,导致硬盘运行缓慢,然后任何进程都变的非常慢,效率越来越低,由于它是一个长时间运行的进程,最终导致内存可能耗尽,然后就死机了。因此我们还要另行检查一下是否有可能是大量的小型文件占用硬盘,例如message system,即directadmin中的内部邮件提醒,若有大量message邮件,在点击message时就可能会造成死机,因此我们需要将其及时清理。可以在/home/用户/Maildir/new/ 中将其清理掉,例如如果是admin用户,则
代码语言:javascript复制rm -f /home/admin/Maildir/new/*
然后从面板中删除message列表
代码语言:javascript复制> /usr/local/directadmin/data/admin/tickets.list
另外,在directadmin自身的目录中还有一份TICKETS保留数据,时间长了会累积的比较大。可以通过以下命令清理。
代码语言:javascript复制rm -rf /usr/local/directadmin/data/tickets/*
③ 在操作完1和2后,本次的处理就已经结束,暂时就已经正常了。接下来我们要对directadmin以上的项做优化。以免下次还因此相同的原因造成出错。优化的内容有三项。分别是“定期清理message邮件“,“自动清理brute_log_entries.list的登录日志列表”,“屏蔽已知的恶意ip登录” 定期清理message邮件: 我们可以在如图中的位置,设置一个值作为合理的自动清理日志的周期。
自动清理brute_log_entries.list的登录日志列表:我们需要在ssh中创建cron计划任务,让它自动清空登录日志,方法如下
代码语言:javascript复制crontab -e
然后编辑内容,例如我们设置为每周五下午两点自动清理brute_log_entries.list。编辑内容如下
0 14 * * 5 > /usr/local/directadmin/data/admin/brute_log_entries.list
再设置删除tickets文件和列表。
代码语言:javascript复制0 15 * * 5 rm -rf /usr/local/directadmin/data/tickets/*
2 15 * * 5 > /usr/local/directadmin/data/admin/tickets.list
保存编辑内容,并重启生效。
代码语言:javascript复制service crond restart
屏蔽已知的恶意ip登录: