定时任务crond及由其导致的inode满案例

1.定时任务crond介绍

1.1 crond是什么

crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件。

特殊需求:(秒级别)crond服务就无法搞定了,一般工作中写脚本守护进程执行。

1.2 为什么要使用crond定时任务

linux系统的定时任务crond,相当于我们平时生活中的闹钟的功能。可以满足周期性执行任务的需求。

1.3 不同系统的定时任务和种类

1.3.1 windows 7 系统的定时任务

开始→所有程序→附件→系统工具→选择任务计划程序

1.3.2 linux系统的定时任务

linux系统中定时任务调度的工作可以分为以下两个情况:

① linux系统自身定期执行的任务工作:系统周期性执行的任务工作,如轮询系统日志,备份系统数据,清理系统缓存等。

centos5.X例:

[[email protected] log]# ll messages*

-rw------- 1 root root 372258 Mar 14 20:48 messages

-rw------- 1 root root 349535 Nov 11 18:13 messages.1

提示:centos 6.4日志轮询结尾是按时间了。

centos6.X例:

[[email protected] log]# ll messages*

-rw------- 1 root root  1591 3月  25 21:57 messages

-rw------- 1 root root 78304 3月   3 20:40 messages-20140303

-rw------- 1 root root 78050 3月   8 19:42 messages-20140311

-rw------- 1 root root   745 3月  18 00:46 messages-20140318

-rw------- 1 root root 77232 3月  22 21:20 messages-20140325

② 用户执行的任务工作:某个用户或系统管理员定期要做的任务工作,例如每隔5分钟和互联网上时间服务器进行时间同步,每天晚上0点备份站点数据及数据库数据,一般这些工作需要由每个用户自行设置才行。

例:

[[email protected] log]# crontab -l

#time sync by lee at 2014-1-14

*/5 * * * * /usr/sbin/ntpdate  time.windows.com >/dev/null  2>&1



2.定时任务crond使用说明

[[email protected] log]# crontab --help

crontab:无效选项 -- -

crontab: usage error: unrecognized option

usage:  crontab [-u user] file

crontab [-u user] [ -e | -l | -r ]

(default operation is replace, per 1003.2)

-e      (edit user‘s crontab)

-l      (list user‘s crontab)

-r      (delete user‘s crontab)

-i      (prompt before deleting user‘s crontab)

-s      (selinux context)

2.1 指令说明

通过crontab我们可以在固定的间隔时间执行指定的系统指令或script脚本。时间间隔的单位是分钟,小时,日,月,周及以上的任意组合(注意:日和周不要组合)

2.2 使用者权限及定时任务文件


文件


说明


/etc/cron.deny


该文件中所列用户不允许使用crontab命令。


/etc/cron.allow


该文件中所列用户允许使用crontab命令,优先于/etc/cron.deny


/var/spool/cron


所有用户crontab配置文件默认都存放在此目录,文件名以用户名命名。

2.3 指令选项说明表


参数


含义


指定示例


-l(字母)


查看crontab文件内容


crontab -l


-e


编辑crontab文件内容


crontab -e


-i


删除crontab文件内容,删除前会提示确认


crontab -ri


-r


删除crontab文件内容


crontab -r


-u user


指定使用的用户执行任务


crontab -u lee -l


提示:crontab{-l |-e}实际上就是在操作/var/spool/cron/当前用户这样的文件。

注:


crontab -e


/var/spool/cron/root


前者会检查语法,而后者不会。


visudo


/etc/sudoers


前者会检查语法,而后者不会。

2.4指令的使用格式

默认情况下,当用户建立定时任务规则后,该规则记录对应的配置文件会存在于/var/spool/cron中,其crontab配置文件对应的文件名与登录的用户名一致。如:root用户的定时任务配置文件为/var/spool/cron/root。

crontab用户的定时任务一般分为6段(空格分隔,系统的定时任务则/etc/crontab分为7段),其中前五段位时间设定段,第六段为所要执行的命令或脚本任务段。

2.4.1 crontab基本格式

* * * * * cmd

提示:

① cmd为要执行的命令或脚本,例如/bin/sh  /server/scripts/lee.sh.

② 每个段之间必须要有空格。

2.4.2 crontab语法格式中时间段的含义表



含义


取值范围


第一段


代表分钟


00-59


第二段


代表小时


00-23


第三段


代表日期


01-31


第四段


代表月份


01-12


第五段


代表星期


0-7(0和7都代表星期日)

2.4.3 crontab语法格式中特殊符号的含义表


特殊符号


含义


*


*号表示任意时间都,就是“每”的意思,举例:如00 01 * * * cmd表示每月每周每日的凌晨1点执行cmd任务。


-


减号,表示分隔符,表示一个时间范围段,如17-19点,每小时的00分执行任务。00 17-19 * * * cmd。就是17,18,19点整点分别执行的意思。



逗号,表示分隔时间段的意思。30 17,18,19 * * * cmd 表示每天17,18,19点的半点执行cmd。也可以和“-”结合使用,如: 30 3-5,17-19 * * * cmd。


/n


n代表数字,即”每隔n单位时间”,例如:每10分钟执行一次任务可以写 */10 * * * * cmd,其中 */10,*的范围是0-59,也可以写成0-59/10。



3.书写crond定时任务7个基本要领

3.1 为定时任务规则加必要的注释

加了注释,就知道定时任务运行的是什么作业,以防以后作业混乱。这是个好习惯和规范。

[[email protected] ~]# crontab -l

#time sync by lee at 2014-1-14

*/5 * * * * /usr/sbin/ntpdate  time.windows.com >/dev/null  2>&1

3.2 定时任务命令或程序最好写到脚本里执行

[[email protected] ~]# crontab -l

#backup www to /backup

00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null  2>&1

3.3定时任务执行的脚本要规范路径,如:/server/scripts

[[email protected] ~]# crontab -l

#backup www to /backup

00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null  2>&1

3.4执行shell脚本任务时前加/bin/sh

执行定时任务时,如果是执行脚本,尽量在脚本前面带上/bin/sh命名,否则有可能因为忘了为脚本设定执行权限,从而无法完成任务。

[[email protected] ~]# crontab -l

#backup www to /backup

00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null  2>&1

3.5 定时任务结尾加 >/dev/null 2>&1

[[email protected] ~]# crontab -l

#backup www to /backup

00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null  2>&1

3.5.1 有关/dev/null的说明

/dev/null为特殊的字符设备文件,表示黑洞设备或空设备。

[[email protected] ~]# ll /dev/null

crw-rw-rw- 1 root root 1, 3 3月  26 01:10 /dev/null

3.5.2 有关重定向的说明

>或1>   输出重定向:把前面输出的东西输入到后边的文件中,会删除文件原有内容。

>>或1>>追加重定向:把前面输出的东西追加到后边的文件中,不会删除文件原有内容。

<或<0   输入重定向:输入重定向用于改变命令的输入,指定输入内容,后跟文件名。

<<或<<0输入重定向:后跟字符串,用来表示“输入结束”,也可用ctrl+d来结束输入。

2>       错误重定向:把错误信息输入到后边的文件中,会删除文件原有内容。

2>>     错误追加重定向:把错误信息追加到后边的文件中,不会删除文件原有内容。

标准输入(stdin):代码为0,使用<或<<。

标准输出(stdout):代码为1,使用>或>>。正常的输出。

标准错误输出(sederr):代码为2,使用2>或2>>。

特殊:

2>&1就是把标准错误重定向到标准输出(>&)。

>/dev/null 2>&1 等价于 1>/dev/null  2>/dev/null

3.5.3 >/dev/null 2>&1的作用

如果定时任务规范结尾不加 >/dev/null 2>&1,很容易导致硬盘inode空间被占满,从而系统服务不正常(var/spool/clientmqueue邮件临时队列目录,垃圾文件存放于此,如果是centos 6.4系统,默认不装sendmail服务,所以不会有这个目录。)

3.6 在指定用户下执行相关定时任务

这里要特别注意不同用户的环境变量问题,如果是调用了系统环境变量/etc/profile,最好在程序脚本中将用到的环境变量重新export下。

3.7生产任务程序不要随意打印输出信息

在调试好脚本程序后,应尽量把DEBUG及命令输出的内容信息屏蔽掉,如果确实需要输出日志,可定向到日志文件里,避免产生系统垃圾。

配置定时任务规范操作过程

①首先要在命令行操作成功,然后复制成功的命令到脚本里,在各个细小环境减少出错的机会。

②然后测试小本,测试成功后,复制脚本的规范路径到定时任务配置里,不要手敲。

③先在测试环境下测试,然后正式环境规范部署。



4.生产场景如何调试crond定时任务

规范的公司开发和运维人员操作流程:个人的开发配置环境-->办公室的测试环境-->idc机房的测试环境-->idc机房的正式环境。

4.1 增加执行频率调试任务

在调试时,把任务执行频率调快一点,看能不能正常执行,如果正常,那就没问题了,再改成需要的任务的执行时间。

注意:有些任务时不允许频繁执行的,例如:定时往数据库里插入数据,这样的任务要在测试机上测试好,然后正式线上出问题的机会就少了。

4.2调整系统时间调试任务

用正确的执行任务的时间,设置完成后,可以修改下系统当前时间,改成任务执行时间的前几分钟来测试(或者重启定时任务服务)

4.3通过日志输出调试定时任务

在脚本中加入日志输出,然后把输出打到指定的日志中,然后观察日志内容的结果,看是否正确执行。

4.4注意一些任务命令带来的问题

注意: * * * * * echo “==”>>/tmp/lee.log >/dev/null 2>&1 这里隐藏的无法正确执行的任务配置,原因是前面多了>>,或者去掉结尾的 >/dev/null 2>&1。

4.5 注意环境变量导致的定时任务故障

例如:在调试java程序任务的时候,注意环境变量,把环境变量的定义加到脚本里。

4.6通过定时任务日志调试定时任务

[[email protected] ~]# tail -f /var/log/cron

Mar 26 15:55:01 angelT CROND[3415]: (ida) CMD (/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1)

Mar 26 15:55:01 angelT CROND[3416]: (root) CMD (/usr/sbin/ntpdate  time.windows.com >/dev/null  2>&1)

Mar 26 16:00:01 angelT CROND[3422]: (root) CMD (/usr/sbin/ntpdate  time.windows.com >/dev/null  2>&1)

Mar 26 16:00:01 angelT CROND[3423]: (root) CMD (/usr/lib64/sa/sa1 1 1)

一:

设置crontab 时提示No space left on device
用df -k 检查还有空间

用df -i  显示 /var 已占用100%,如果inode耗尽,则系统上将不能创建文件。

在/var/spoo/clientmqueue/下有超多的文件 ls 半天没反应
用rm -rf *  会自动跳出root,用xargs来解决。

# cd /var/spool/clientmqueue

# ls | xargs rm -f

原因分析:系统中cron执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件;
解决办法:   将crontab里面的命令后面加上> /dev/null 2>&1

二:

故障现象:

1 when you create a new directory or file , system will say : No space left  on device

[[email protected] /var]# mkdir aa

mkdir: cannot create directory `aa‘: No space left on device

2 when create crontab for account shelladm , you will receive error  information as follows:

"crontab.6655" 1L, 13C written

crontab: installing new crontab

cron/tmp.6655: No space left on device

crontab: edits left in /tmp/crontab.6655

处理步骤:

1 检查分区使用率

[[email protected] ~]# df -lk
Filesystem           1K-blocks      Used Available  Use% Mounted on
/dev/hda2              3020172    136008   2730744   5%  /
/dev/hda1               101089      9378     86492  10%  /boot
/dev/hda7            105708092  38996880  61341488  39%  /b2006
none                   1028548         0   1028548   0%  /dev/shm
/dev/hda3              3020172   1421092   1445660  50%  /usr
/dev/hda6               497829    371795    100332  79%  /var
分区/var的使用率只有79%,系统有空间可以用

2 检查/var/lock下的文件,删除/var/lock/subsys/nfs后,touch /var/aa,成功创建文件,删除/var/aa

3 发现删除/var/lock下的任意一个文件后

[[email protected] /var]#touch /var/aa        -------------------成功

[[email protected] /var]# touch aa1                -------------------失败
touch:  creating `aa1‘: No space left on device

4 将检查扩大到/var下的其他目录,
[[email protected] icons]# cd /var/www/icons
[[email protected]  icons]# mv a.gif /tmp
[[email protected] icons]# mv a.png /tmp      -------------------移走两个文件
[[email protected] icons]# df -li
[[email protected] icons]#  touch aa
[[email protected] icons]# touch bb
[[email protected] icons]# touch  cc
touch: creating `cc‘: No space left on device  -----------只能创建两个文件,当创建第三个文件时,出错

5 怀疑分区/var的inode用尽导致上述问题,检查inode使用率

[[email protected] icons]# df -li
Filesystem            Inodes   IUsed   IFree  IUse% Mounted on
/dev/hda2             384000   23698  360302    7%  /
/dev/hda1              26104      41   26063    1%  /boot
/dev/hda7            13434880    7964 13426916    1%  /b2006
none                  257137       1  257136    1%  /dev/shm
/dev/hda3             384000   78026  305974   21%  /usr
/dev/hda6             128520  128520       0  100%  /var
发现/var的inode使用率已经达到100%,空余的inode为0

6 分区/var没有配置quota ,平均每个inode的占用空间为:497829k(var  size)/128520(inodes)=3.87k,说明分区的最小block为4k,无法增加inode限额。

7  发现/var/spool/clientmqueue下面有太多的文件,共有127679个,占用了127679/128520(inodes)=99.3%的inode
   系统的邮件配置有问题,导致系统发出的邮件堆积在队列中,占用的大量的inode.

处理方法:确认/var/spool/clientmqueue下的文件已经无用后,删除之。然后/var写入正常。
           最好的解决办法是重新设置系统邮件,使其能正常发送。

删除文件后的inode使用情况
[[email protected] clientmqueue]# df -li
Filesystem             Inodes   IUsed   IFree IUse% Mounted on
/dev/hda2             384000   23698   360302    7% /
/dev/hda1              26104      41   26063    1%  /boot
/dev/hda7            13434880    7964 13426916    1%  /b2006
none                  257137       1  257136    1%  /dev/shm
/dev/hda3             384000   78026  305974   21%  /usr
/dev/hda6             128520    4561  123959    4% /var

结论:分区/var的inode全部用尽,free inode为0,导致无法创建新的文件或目录,以后遇到类似的问题要注意

用df -li  检查inode的使用情况。
################################################################################

当启动apache的时候报这种错:

No space left on device: Couldn‘t create accept lock
df -h 一下发现不是磁盘空间的问题,google了一下发现是系统的Semaphore Arrays不够用了,用以下命令可以查看所有的Semaphore Arrays:ipcs -s  然后用这行命令删除所有的Semaphore Arrays即可:ipcs -s | grep nobody | perl -lane ‘print `ipcrm sem $F[1]`‘  (其中nobody表示用户名)
时间: 2024-10-12 10:32:17

定时任务crond及由其导致的inode满案例的相关文章

linux 定时任务 crond 服务应用指南

linux定时任务crond服务应用指南 Linux的定时任务crond(crontab)服务 1.crond是什么? crond是linux系统中用来定期执行命令或者指定程序的程序(软件) 2.秒级任务 (1)crond需要方式实现 (2)自己写守护进程shell循环 (3)Quartz也可实现妙计任务 3.定时任务的作用 服务器:7*24小时开机提供服务是网站的基本特征 有重要数据:提高备份周期和备份数量 Linux的定时任务分类 linux系统中定时任务调度的工作可以分为一下两种 (1)系

linux定时任务crond那些事!

来自老男孩教育的运维班面授课程内容,17期依良同学作业整理而得! 1.定时任务crond介绍 1.1 crond是什么 crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件. 特殊需求:(秒级别)crond服务就无法搞定了,一般工作中写脚本守护进程执行. 1.2 为什么要使用crond定时任务 linux系统的定时任务crond,相当于我们平时生活中的闹钟的功能.可以满足周期性执行任务的需求. 1.3 不同系统的定时任务和种类 1.3.1 windows 7 系统的定时任务

Linux系统定时任务crond那些事

1 Linux系统定时任务 1.1 定时任务介绍 1.1.1 Crond是什么? Crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件.Centos5/6 linux系统安装完操作系统默认会启动crond任务调度服务,系统开机启动优化保留crond服务开机自启动.Crond服务定期(默认是每分钟检查一次)检查系统中是否有要执行的任务工作.这个crond定时任务服务就相当于我们平时使用的闹钟一样.特殊需求:(秒级别)crond服务搞不定了,工作中一般写脚本守护程序执行. 1.

linux定时任务crond生产Java服务手动可执行,脚本不可执行案例

linux定时任务crond export变量问题群友案例 来自网友兄弟 北京@Grady(254553457) 的总结. 1)我写了一个重启resin的脚本,由于业务原因,需要定时在某一个时间重启下resin服务器,于是就在crontab里配置了如下内容:50 17 * * 1-5 root /usr/local/bin/resin_restart.sh其中,resin_restart.sh内容如下:#!/bin/sh/usr/local/bin/xxresin_stop.sh/usr/loc

Linux系统定时任务Crond

Crond是什么 Crond是Linux系统中用来定期执行命令或指定程序任务的一种服务或软件. 特殊需求:(秒级别)crond服务就无法搞定,一般工作中邪脚本守护进程执行(一般用不上) 为什么要使用crond定时任务 Linux系统的定时任务crond,相当于我们平时生活中得闹钟功能.可以满足周期性执行任务的需求. Linux系统的定时任务 Linux系统中定时任务调度的工作可以分为以下两种情况 1.Linux系统自身定期执行的任务工作:系统周期性执行的任务工作,如轮询系统日志,备份系统数据,清

linux no space left on device的解决办法(iNode满导致)

今天在腾讯云的服务器被攻击后,apache启动报错,查找原因发现是磁盘空间不够no space left on device, 诡异的是df命令磁盘占用仅55% 继续查找原因,发现是iNode已满,即没有索引空间 这就好办了,首先定位哪个目录占用iNode最多,命令如下: find */ ! -type l | cut -d / -f 1 | uniq -c 定位完成,清理目录,整个世界都清净了 linux no space left on device的解决办法(iNode满导致),布布扣,b

Linux inode满导致创建文件报磁盘空间不足

客户报不能挂载存储,系统异常.登陆系统,尝试手动mount分区,报失败.进入挂载点,尝试写入一个文件,报磁盘空间不足,首先怀疑是系统磁盘空间满: $ df Filesystem           1K-blocks      Used Available Use% Mounted on /dev/xvda 33030016 10407780 22622236 32% / tmpfs 368748 0 368748 0% /lib/init/rw varrun 368748 56 368692

SQL SERVER 2012 执行计划走嵌套循环导致性能问题的案例

原文:SQL SERVER 2012 执行计划走嵌套循环导致性能问题的案例 开发人员遇到一个及其诡异的的SQL性能问题,这段完整SQL语句如下所示: declare @UserId             INT declare @PSANo              VARCHAR(200) declare @ShipMode           VARCHAR(10) declare @CY_FLAG            VARCHAR(1) declare @PO            

Mybatis 并发执行导致cpu占满的问题

最近线上服务经常 出现cpu达到100%的问题,发现都是执行oracle操作的方法就没有返回.经过排查,最后定位到cpu消耗在以下方法 System.Collections.Generic.Dictionary`2<system.type,system.boolean>.FindEntry (...)System.Collections.Generic.Dictionary`2<system.__canon,system.boolean>.TryGetValue (...)MyBa