红联Linux门户
Linux帮助
当前位置: 红联Linux门户 > Debian

自动kill进程解决电驴溢出的馊主意

发布时间:2011-05-12 16:58:37来源:红联作者:okzokz123
[i=s] 本帖最后由 okzokz123 于 2011-5-13 16:37 编辑 [/i]

由于近来受累于debian64和ubuntu64中的amule内存泄漏,实在是很烦,就想了个办法来临时解决这个恼人的问题(最终还是要deb系中amule品质改善才能彻底解决)。这个办法也通行于其他与内存泄漏有关的网络程序。

思路:

1.通过端口扫描来确定内存占用大的进程并结束,目的是结束内存泄漏时的amule进程(这个脚本是网上找来改的非原创,先声明一下免得被指抄袭^_^)

2.使其自动化

为什么不结束后再重启呢这里有几个因:第一,内存泄漏时磁盘i/o很紧张不去添加负担。第二,结束后短时间内重启(次数多的话)恐被服务器ban掉。第三,万一某天我不放驴子,但驴子出来了岂不是还要来结束这个自作多情的进程么(还得循环结束或使用另外的脚本就麻烦了)。

达到第一个目的很简单,使用网上找来的脚本改下就ok了;要达到第二个目的也容易,使用linux中的crontab就行,但带来另外两个问题关于磁盘保护和邮件。
好了进入正题:
1.建立一个自己的tmpfs目录用来安装tmpfs,把kill amule的脚本放进去使其在保存在内存中(驴子的内存泄漏是很快的,十来秒就能占数百M,所以我将把脚本设置为每10秒运行一次,我才不希望系统在硬盘上如此频繁的读脚本)。当然也可以使用系统自己的/dev/shm,只不过我喜欢自己的。
$mkdir /home/yy/ktmp //ktmp就是用来装tmpfs的 yy是我的用户名

2.让系统开机自动挂载ktmp为tmpfs,这个要修改/etc/fstab了
$sudo chmod +w /etc/fstab //给fstab加写入权
$sudo gedit /etc/fstab //修改fatab加下面这一行
none /home/yy/ktmp tmpfs size=1888M,nodev,nosuid,noexec 0 0
这样开机自动挂载ktmp成tmpfs并设定最大能使用1888MB,并非就立刻占了这么大的内存,除了脚本用掉的几百K 余下的还可被其他程序用。
df你会发现多了个/home/yy/ktmp的分区且容量是1888MB,但这是内存,可不是真的多了啊,重要东东不要放里面。

3.做个kill amule的脚本放在 /homt/yy/中以便载入/home/yy/ktmp,我命名为kamule.内容如下:
#!/bin/bash

ram_max=10
//设置程序能使用的最大内存百分比为10%达到这个值即触发killamule
port=4662;4672
//监控端口4662和4672 这是驴子要用的
pid_ram=` netstat -nlp |grep $port|awk '{print $7}'|awk -F / '{print $1}' `
//通过端口截获驴子的pid
ram=` ps -aux |grep -m1 $pid_ram|awk '{print $4}'|awk -F . '{print $1}' `
//获得内存占用量
if expr $ram \>= $ram_max > /dev/null
//如果发生溢出的条件满足即开始下面的操作
then

echo "4662 amule be killed“ >>/home/yy/autokamule.log //kill事件发生后写入日志
echo `date` >>/home/kk/autokamule.log //日志中追加日期
kill -9 $pid_ram
//自动结束溢出的电驴进程
mplayer /home/yy/音乐/爱的供养-杨幂.mp3
//放首歌以提示 谁说用linux的就没娱乐需求?
fi //结束了

4. 建立/etc/cron.allow /etc/cron.deny 这两个文件内输入用户名----每行一个不带空格和符号(这个我是照书上做的,现在的版本是否需要不清楚,照做就行了)

5.$crontab -e //建立自己的crontab文件如下(编辑器看自己喜好,用nano一会就学会了):
SHELL=/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow command

#cp kamule to tmpfs
每天早上8:10载入kamule的脚本到前面设置的tmpfs中
10 8 * * * source ~/.bashrc && cp /home/yy/kamule /home/yy/ktmp



#sh kamule
设定每十秒运行一次killamule的脚本 这里的>>/dev/null 2>&1更改邮件地址为空使其不发到/var/spool/mail避免爆/var(每十秒一次太多了)
* * * * * source ~/.bashrc sleep 10 && cd /home/yy/ktmp && bash kamule >>/dev/null 2>&1

* * * * * source ~/.bashrc sleep 20 && cd /home/yy/ktmp && bash kamule >>/dev/null 2>&1

* * * * * source ~/.bashrc sleep 30 && cd /home/yy/ktmp && bash kamule >>/dev/null 2>&1

* * * * * source ~/.bashrc sleep 40 && cd /home/yy/ktmp && bash kamule >>/dev/null 2>&1

* * * * * source ~/.bashrc sleep 50 && cd /home/yy/ktmp && bash kamule >>/dev/null 2>&1
##crontab写好后按保存会自动保存在/var/spool/cron/crontabs中一个以用户名为文件名的文件中,同时也会写入缓存启动
##这个#符号的一行为注释,里面的汉字就不要写进去了包括本行。
6.$sudo /etc/init.d/cron restart 虽然现在的版本会自动运行但还是重启一次crontab服务来立刻运行一下以确定生效。
OK
这是个没办法的馊主意,但至少放驴子的时候不怕溢出了(特别是人不在的时候溢出刮硬盘那个心痛啊)。希望debain和ubuntu能解决驴子乱跑的问题。
文章评论

共有 9 条评论

  1. ruanmeimofang 于 2014-05-26 17:09:10发表:

    支持回复,支持高手

  2. gky2009514 于 2012-12-07 13:24:47发表:

    新手完成任务,求下书籍~

  3. 61344277 于 2012-01-11 02:22:13发表:

    虽然晚了几个月,不过还是说声吧

    楼主的问题,用 ulimit 解决比较好

  4. wq413732076 于 2011-08-03 21:12:02发表:

    感谢楼主分享我要学linux

  5. dqwit 于 2011-05-30 17:48:38发表:

    哈哈哈

  6. 346467156 于 2011-05-14 00:55:49发表:

    还不错。支持原创~~

  7. 346467156 于 2011-05-14 00:55:48发表:

    还不错。支持原创~~

  8. Growth兆 于 2011-05-13 09:48:45发表:

    感谢okzokz123的分享,本贴加入到论坛顶置的Linux应用贴中

  9. qvooqi 于 2011-05-12 21:11:58发表:

    强文,支持楼主