linux系统的任务计划
crond命令简介
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab文件包括下面几行:
[[email protected] ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
crontab文件的含义:用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week user-name
- minute: 表示分钟,可以是从0到59之间的任何整数。
- hour:表示小时,可以是从0到23之间的任何整数。
- day:表示日期,可以是从1到31之间的任何整数。
- month:表示月份,可以是从1到12之间的任何整数。
- week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
- user-name :用户名,若不写则默认为当前用户。
- command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
- 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
crond命令服务
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
service crond status // 查看服务状态
ceondtab命令详解
1.命令格式:
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
2.命令功能:
通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。
3.命令参数:
-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crontab文件时给确认提示。
4.常用方法举例
20 1 * * * echo " " > /var/log/slow.log
每天凌晨1点20分清除/var/log/slow.log这个文件
00 3 * * 0 /bin/sh /usr/local/sbin/backup.sh
每周日3点执行 “/bin/sh /usr/local/sbin/backup.sh”
10 4 14 * * /bin/sh /usr/local/sbin/backup_month.sh
每月14号4点10分执行 “/bin/sh /usr/local/sbin/backup_month.sh”
00 */8 * * * ntpdate time.windows.com
每隔8小时执行 “ntpdate time.windows.com”
00 1,12,18 * * * /bin/sh /usr/local/sbin/test.sh
每天的1点,12点,18点执行 “/bin/sh /usr/local/sbin/test.sh”
00 09-18 * * * /bin/sh /usr/local/sbin/test2.sh
每天的9点到18点执行 “/bin/sh /usr/local/sbin/test2.sh”
anacron和cron服务的区别:
cron是用来控制循环执行的例行性工作的,可循环的时间为分钟、小时、每周、每月或每年等。比如我要设定机器每天早上8点进行备份,就可以用到这个服务。
除非我们的机器保持每天都24小时开始,否则就会有些系统例行工作都没有人做了,这个时候就可以用到anacron了。
anacron并不是用来取代cron的,anacron 存在的目的就在于我们上面提到的,在处理非 24 小时一直启动的 Linux 系统的 cron 服务的执行!所以 anacron 并不能指定何时执行某项任务, 而是以天为单位或者是在开机后立刻进行 anacron 的动作,他会去侦测停机期间应该进行但是并没有进行的 cron服务,如果有就将该任务执行一遍,然后就自动停止。
使用crontab命令的扩展知识:
1. 注意环境变量问题
有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。
在crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这样,系统执行任务调度时就没有问题了。
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
2. 注意清理系统用户的邮件日志
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。
例如,可以在crontab文件中设置如下形式,忽略日志输出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。
3. 系统级任务调度与用户级任务调度
系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc/crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。
4. 其他注意事项
新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。
5.恢复丢失的crontab文件
如果不小心误删了crontab文件,假设你在自己的$ H O M E目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完成拷贝,可以用:
$ crontab <filename>
其中,<filename>是你在$ H O M E目录中副本的文件名。
我建议你在自己的$ H O M E目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。
有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。
ntsysv命令
ntsysv命令提供了一个基于文本界面的菜单操作方式,集中管理系统不同的运行等级下的系统服务启动状态。在RedHat各个发行版,CentOS各个版本,都自带这个工具。它具有互动式操作界面,您可以轻易地利用方向键和空格键等,开启,关闭操作系统在每个执行等级中,所要执行的系统服务。
yum安装:yum install -y ntsysv
运行ntsysv 命令会弹出配置窗口:
按键盘的上下方向键进行移动,按空格键选择或者取消,中括号内显示有 * 表示开启,否则不开启。
chkconfig命令
chkconfig命令检查、设置系统的各种服务。这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。
选项:
--add:增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据;
--del:删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据;
--level<等级代号>:指定读系统服务要在哪一个执行等级中开启或关毕。
--list [name]: 显示所有运行级系统服务的运行状态信息(on或off)。如果指定了name,那么只显示指定的服务在不同运行级的状态。
等级代号列表:
- 等级0表示:表示关机
- 等级1表示:单用户模式
- 等级2表示:无网络连接的多用户命令行模式
- 等级3表示:有网络连接的多用户命令行模式
- 等级4表示:不可用
- 等级5表示:带图形界面的多用户模式
- 等级6表示:重新启动
应用举例:
开启指定服务:
[[email protected] cron]# chkconfig --list atd//列出atd服务的运行状态
atd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:启用 6:关闭
[[email protected] cron]# chkconfig atd off//关闭服务
[[email protected] cron]# chkconfig --list atd
atd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
[[email protected] cron]# chkconfig atd on//开启服务
[[email protected] cron]# chkconfig --list atd
atd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[[email protected] cron]# chkconfig --level 234 atd off//按等级代号关闭服务
[[email protected] cron]# chkconfig --list atd
atd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:启用 6:关闭
[[email protected] cron]# chkconfig --level 234 atd on//按等级代号开启服务
[[email protected] cron]# chkconfig --list atd
atd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
开启新服务:
[[email protected] cron]# cd /etc/init.d/ //服务都是放在此目录中
[[email protected] init.d]# ls
atd functions kdump mysqld network restorecond single
auditd halt killall named portreserve rsyslog sshd
crond ip6tables mdmonitor netconsole postfix sandbox sysstat
cups iptables messagebus netfs rdisc saslauthd udev-post
[[email protected] init.d]# cp atd aming //可以在此目录添加mysqld、httpd或者自定义脚本等服务
[[email protected] init.d]# ls
aming functions killall netconsole rdisc single
atd halt mdmonitor netfs restorecond sshd
auditd ip6tables messagebus network rsyslog sysstat
crond iptables mysqld portreserve sandbox udev-post
cups kdump named postfix saslauthd
[[email protected] init.d]# chkconfig --list aming
aming 服务支持 chkconfig,但它在任何级别中都没有被引用(运行“chkconfig --add aming”)
[[email protected] init.d]# chkconfig --list |grep aming
[[email protected] init.d]# chkconfig --add aming //添加aming服务
[[email protected] init.d]# chkconfig --list |grep aming
aming 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
[[email protected] init.d]# chkconfig --level 35 aming on //修改服务默认启动等级
[[email protected] init.d]# chkconfig --del aming
[[email protected] init.d]# chkconfig --list aming
aming 服务支持 chkconfig,但它在任何级别中都没有被引用(运行“chkconfig --add aming”)
[[email protected] init.d]# ls
aming functions killall netconsole rdisc single
atd halt mdmonitor netfs restorecond sshd
auditd ip6tables messagebus network rsyslog sysstat
crond iptables mysqld portreserve sandbox udev-post
cups kdump named postfix saslauthd
linux系统日志
centos6默认改为 rsyslog.conf 之前版本是 syslog.conf. 该配置文件主要信息为:记录哪些服务和需要记录什么等级的信息。
日志格式:
auth –pam产生的日志
authpriv –ssh,ftp等登录信息的验证信息
cron –时间任务相关
kern –内核
lpr –打印
mail –邮件
mark(syslog)–rsyslog服务内部的信息,时间标识
news –新闻组
user –用户程序产生的相关信息
uucp –unix to unix copy, unix主机之间相关的通讯
local 1~7 –自定义的日志设备
日志级别:
debug –有调式信息的,日志信息最多
info –一般信息的日志,最常用
notice –最具有重要性的普通条件的信息
warning –警告级别
err –错误级别,阻止某个功能或者模块不能正常工作的信息
crit –严重级别,阻止整个系统或者整个软件不能正常工作的信息
alert –需要立刻修改的信息
emerg –内核崩溃等严重信息
none –什么都不记录
从上到下,级别从低到高,记录的信息越来越少
连接符号
.xxx: 表示大于等于xxx级别的信息
.=xxx:表示等于xxx级别的信息
.!xxx:表示在xxx之外的等级的信息
系统的那些讯息以及应该记录在那些档案, 或如何显示, 是由 /etc/syslog.conf 来控制的. 以下是 RedHat 的 /var/log 目录中一些重要的记录档案的说明.
1. /var/log/lastlog : 记录每个使用者最近签入系统的时间, 因此当使用者签入时, 就会显示其上次签入的时间, 您应该注意一下这个时间, 若不是您上次签入的时间, 表示您的帐号可能被人盗用了. 此档可用 /usr/bin/lastlog 指令读取.
我们在登陆的时候不知道大家看到了不,LINUX会显示我们上一次登陆的时间 我们第一次开启的时候不知道但是在第二次的时候就看到了!呵呵 我够仔细的吧!
2. /var/run/utmp : 记录每个使用者签入系统的时间, who, users, finger 等指令会查这个档案.
3. /var/log/wtmp : 记录每个使用者签入及签出的时间, last 这个指令会查这个档案. 这个档案也记录 shutdown 及 reboot 的动作.
4. /var/log/secure : 记录那些站台连线进来, 以及那些位址连线失败.
5. /var/log/maillog : 记录 sendmail 及 pop 等相关讯息.
6. /var/log/cron : 记录 crontab 的相关讯息
7. /var/log/dmesg : /bin/dmesg 会将这个档案显示出来, 它是开机时的画面讯息.
8. /var/log/xferlog : 记录那些位址来 ftp 拿取那些档案.
9. /var/log/messages : 系统大部份的讯息皆记录在此, 包括 login, check password , failed login, ftp, su 等。
last 用来查看登录linux的历史信息
last命令输出信息实际上是读取/var/log/wtmp 二进制文件,不能用cat vim head tail查看;
[[email protected] init.d]# last
root pts/0 192.168.1.100 Wed Apr 22 15:26 still logged in
reboot system boot 2.6.32-504.12.2. Wed Apr 22 15:23 - 18:58 (03:35)
root pts/1 192.168.1.100 Tue Apr 21 17:17 - down (00:13)
root pts/0 192.168.1.100 Tue Apr 21 15:50 - down (01:40)
reboot system boot 2.6.32-504.12.2. Tue Apr 21 15:48 - 17:30 (01:42)
.......
lastb 查看无效的登录历史,有人恶意登录会记录; 实际上是读取/var/log/btmp文件
[[email protected] init.d]# lastb
root tty1 Fri Apr 17 15:59 - 15:59 (00:00)
root tty1 Thu Apr 16 16:28 - 16:28 (00:00)
root tty1 Wed Apr 15 16:19 - 16:19 (00:00)
123456 ssh:notty 192.168.1.100 Sun Apr 12 02:32 - 02:32 (00:00)
123456 ssh:notty 192.168.1.100 Sat Apr 11 02:45 - 02:45 (00:00)
dmesg命令被用于检查和控制内核的环形缓冲区。kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息保存在/var/log/dmesg
文件里
dmesg命令和/var/log/dmesg是不一样的,还需今后有时间找出其中的不同。
screen命令
一、背景
系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。
二、简介
GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。
GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
- 会话恢复
- 只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
- 多窗口
- 在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。
- 会话共享
- Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。
参数说明
-A 将所有的视窗都调整为目前终端机的大小。
-d <作业名称> 将指定的screen作业离线。
-h <行数> 指定视窗的缓冲区行数。
-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称> 恢复离线的screen作业。
-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s 指定建立新视窗时,所要执行的shell。
-S <作业名称> 指定screen作业的名称。
-v 显示版本信息。
-x 恢复之前离线的screen作业。
-ls或--list 显示目前所有的screen作业。
-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
四、常用screen参数
screen -S yourname -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname -> 回到yourname这个session
screen -d yourname -> 远程detach某个session
screen -d -r yourname -> 结束当前session并回到yourname这个session
在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
C-a ? -> 显示所有键绑定信息
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next,切换到下一个 window
C-a p -> Previous,切换到前一个 window
C-a 0..9 -> 切换到第 0..9 个 window
Ctrl+a [Space] -> 由视窗0循序切换到视窗9
C-a C-a -> 在两个最近使用的 window 间切换
C-a x -> 锁住当前的 window,需用用户密码解锁
C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
C-a w -> 显示所有窗口列表
C-a t -> Time,显示当前时间,和系统的 load
C-a k -> kill window,强行关闭当前的 window
C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode
C-a ] -> Paste,把刚刚在 copy mode 选定的内容贴上
事例操作:
[[email protected] init.d]# screen //另开一个窗口进入
[[email protected] init.d]# top //在输入命令后放入后台,退出按Ctrl+a d
[[email protected] init.d]# screen // 在另开一个窗口进入
[[email protected] init.d]# vmstat 1 //在输入命令后放入后台,退出按Ctrl+a d
[[email protected] init.d]# screen -ls //列出后台命令
There are screens on:
1903.pts-0.hpf-linux (Detached)
1931.pts-0.hpf-linux (Detached)
2 Sockets in /var/run/screen/S-root.
[[email protected] init.d]# screen -r 1903//进入指定的后台命令,进入后按Ctrl+c关闭进程,输入exit退出。
[detached]
[[email protected] init.d]# screen -S aming//指定后台进程的名字
[detached]
[[email protected] init.d]# screen -ls
There are screens on:
1903.pts-0.hpf-linux (Detached)
1950.aming (Detached)
1931.pts-0.hpf-linux (Detached)
3 Sockets in /var/run/screen/S-root.
参考:
http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html
http://www.jb51.net/os/RedHat/1162.html
http://8802265.blog.51cto.com/8792265/1636492
扩展:
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2181978&highlight=
http://blog.chinaunix.net/uid-38608-id-2411105.html
http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html