Linux系统Crontab定时任务 - 简述

本文介绍如何设置定时任务清理服务器内存,包括创建可执行文件、编辑crontab及常见问题排查等步骤。

To: 写给第一次使用定时任务的小白


逻辑分为以下三点: ①建立一个可执行文件(权限要求自己定义,有权限执行就行)。②vim /etc/crontab 编辑定时程序   ③程序会根据定时代码定时执行程序  


①建立一个可执行文件(权限要求自己定义,有权限执行就行):

    

MAILTO=root 表示执行用户  我一般不用这个, 因为user-name 直接用root即可(这么写可能会不妥,但是我不知道有什么不妥,在下不是运维是JAVA--这有可能是JAVA被黑的最惨的一次)


中间的时间什么的, 和JAVA定时器代码的规则查不了多少,  这里*/10 就是指 每10分钟执行一次  

至于root后面的  sh  /home/dabackup/db2backup.sh  则是定时程序执行的指令


有些第一次使用定时器的同学可能尝试了很多网上直接copy的定时代码但是发现/etc/crontab上并没有什么毛病就是程序不跑

首先我们要确定的是: 系统重新加载过定时程序 指令: /sbin/service crond reload

然后重启服务指令:  /sbin/service crond restart 

【附加:启动服务指令sbin/service crond start    关闭服务指令 /sbin/service crond stop】



如果重新载入&重新启动了定时程序还是不行, 那肯定是执行代码有问题, 这里说的执行代码说的是sh  /home/dabackup/db2backup.sh里面的定时任务的内容代码

【定时清理内存  注意vim sh文件时的set ff格式  设置为set ff=unix】
#!/bin/bash
echo "current time is $(date -d "today" +"%Y-%m-%d-%H-%M-%S")"  >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
#系统分配的区总量 
mem_total=`free | grep "Mem:" |awk '{print $2}'` 
echo "mem_total is $mem_total " >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
#当前剩余的大小 
mem_free=`free | grep 'buffers/cache' | awk '{print $3}'`

echo "mem_free is $mem_free" >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
#当前已使用的used大小 
mem_used=`free -m | grep Mem | awk '{print  $3}'` 
echo "mem_used is $mem_used" >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
if (($mem_used != 0)); then 
#如果已被使用,则计算当前剩余free所占总量的百分比,用小数来表示,要在小数点前面补一个整数位0 
mem_per=0`echo "scale=2;$mem_free/$mem_total" | bc` 
echo "free percent is $mem_per" >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
DATA="$(date -d "today" +"%Y-%m-%d-%H-%M-%S") free percent is : $mem_per"
echo $DATA >> /usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
echo $DATA >> /var/log/mem_detect.log
#设置的告警值为44%(即使用超过56%的时候告警)。 
mem_warn=0.4 
echo "mem_warn is $mem_warn"  >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
#当前剩余百分比与告警值进行比较(当大于告警值(即剩余44%以上)时会返回1,小于(即剩余不足44%)时会返回0 ) 
mem_now=`expr $mem_per \> $mem_warn` 
echo "剩余百分比与警告值比较 mem_now is $mem_now"  >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
echo "when mem_now is 1 , means mem is ok ! "  >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log

echo "-----------------------------------" >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
#如果当前使用超过56%(即剩余小于44%,上面的返回值等于0),释放内存
if (($mem_now == 0)); then 
echo "but now the mem_now is 0 ,小于(即内存剩余不足44%),所以清理内存, start to clear memery....." >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
echo "---> start auto clear memery is OK ! $DATA , warn is $mem_warn ,小于(即内存剩余不足44%),所以清理内存, " >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d_%H).log
fi


#取当前空闲cpu百份比值(只取整数部分) 
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."`
echo "cpu_idle percent is $cpu_idle,cpu 剩余量充足,警告值是当剩余不足30%时,自动清理内" >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
echo "================================================================" >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
#设置空闲cpu的告警值为30%,如果当前cpu使用超过70%(即剩余小于30%),立即发邮件告警,自动清理内存 
if (($cpu_idle < 30)); then
echo " cpu 剩余不足30% ,所以清理内存, start to clear memery....." >>/usr/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
      sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
echo "--->cpu used more than 70% ,so start auto clear memery is OK ! $DATA , warn is $mem_warn " >>/usr/tomcat_treasure/logs/memery_monitor/memstat_cpu_auto_$(date +%Y%m%d_%H).log
fi
fi

例如我的这个定时清理服务器内存的代码, 你可以不用去看细节,但是,在你确定/etc/crontab的语句没有问题之后,你应该检测这里的执行代码没有错误,可以模拟系统定时手动复制粘贴跑一边这些代码,诸如会发现

①路径不对  

②系统没有这个指令(网上大拿写的系统和我们的系统版本、类型不一致,都会导致这些问题) 

③编码问题: 在WinSCP上新建,用Notepad++编辑的文件会导致一些编码问题, 这时候可以vim 你的执行文件(本文是vim /home/dbbackup/db2backup.sh) ,进去之后直接/set ff  查询编码格式     如果不是unix格式   执行/set ff=unix  则自动转换为unix格式 ---->编码问题一般解决系统报错 $'\r' command not found  其实就是Notepad++的换行指令和unix的换行指令是不兼容的.


综上所述,  其实都是一些很小的问题, 但是作为一个码农我们要从用户角度出发,内心要驻扎一个产品经理的思维模拟服务器小白第一次建立定时程序时会有可能出现的问题, 来做一个小小的归纳, that's all. Good luck & have fun.


概要:   DevCon 实用工具是一种命令行实用工具,可以替代设备管理器。使用 DevCon,您可以启用禁用、重新启动、更新、删除查询单个设备或一组设备。DevCon 提供与开发人员有关但无法在设备管理器中看到的信息。   您可以将 DevCon 用于 Windows 2000 、Windows XPWindows vista。不能将 Devcon 用于 Microsoft Windows 95、Windows 98、或 Windows Millennium Edition。   下载:http://download.microsoft.com/download/1/1/f/11f7dd10-272d-4cd2-896f-9ce67f3e0240/devcon.exe 用法及参数说明:   devcon.exe [-r] [-m:\\] [...]   -r 如果指定它,在命令完成后若需要则重新启动计算机。    是目标计算机的名称。    是将要执行的命令(如下所示)。   ... 是命令需要的一个或多个参数。   要获取关于某一特定命令的帮助,请键入:devcon.exe help   classfilter 允许修改类别筛选程序。   classes 列出所有设备安装类别。   disable 禁用与指定的硬件或实例 ID 匹配的设备。   driverfiles 列出针对设备安装的驱动程序文件。   drivernodes 列出设备的所有驱动程序节点。   enable 启用与指定的硬件或 实例 ID 匹配的设备。   find 查找与指定的硬件或 实例 ID 匹配的设备。   findall 查找设备,包括那些未显示的设备。   help 显示此信息。   hwids 列出设备的硬件 ID。   install 手动安装设备。   listclass 列出某一安装类别的所有设备。   reboot 重新启动本地计算机。   remove 删除与特定的硬件或 实例 ID 匹配的设备。   rescan 扫描以发现新的硬件。   resources 列出设备的硬件资源。   restart 重新启动与特定的硬件或 实例 ID 匹配的设备。   stack 列出预期的设备驱动程序堆栈。   status 列出设备的运行状态。   update 手动更新设备。   UpdateNI 手动更新设备,无用户提示   SetHwID 添加、删除更改根枚举设备的硬件 ID 的顺序。 示例:   devcon -m:\\test find pci\* 列出计算机 test 上的所有已知 PCI 设备。(通过使用 -m,您可以指定一个目标计算机。您必须使用“进程间通信”(IPC) 访问此计算机。)   devcon -r install Windows directory\Inf\Netloop.inf *MSLOOP 安装一个新的 Microsoft 环回适配器实例。这将创建一个新的根枚举设备节点,使用此节点您可以安装“虚拟设备”,如环回适配器。如果需要重新启动计算机,此命令还将以安静模式重启计算机。   devcon classes 列出所有已知的安装类别。输出结果包含短的未本地化的名称(例如,“USB”)描述性名称(例如,“通用串行总线控制器”)。 禁用启用网卡的步骤:   1.用devcon hwids PCI*命令得到所有以PCI开头的设备。这时会列出很多设备,那么哪个才是网卡对应的呢?   2.打开设备管理器,展开网络适配器,找到网卡的名称,然后记住到刚才得到的列表中找对应的Name,然后你会在下面看到好几个ID,随便挑一个就行   3.用devcon disable "PCI\VEN_11AB&DEV_4380&SUBSYS_301B17AA&REV_10"禁用网卡(启用的话讲disable换成enable就行了)   4.其实用PCI开头得到的几组设备中一般第一个就是网卡设备 sysdzw 16:01 2010-11-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值