但是,让crond来周期性实行脚本发送邮件关照时,碰着了问题,在crontab -e里面加入了实行脚本之后,创造脚本并没有实行。
可是,通过手动实行Shell脚本命令(./mimvp-email.sh)是正常的,由于手动实行脚本可以默认获取Linux的环境变量,但通过Crontab做的定时任务,则无法获取环境变量。
剖析了缘故原由,crond不实行的缘故原由紧张有以下几个方面:

1、crond做事没启动
ps -ef | grep -v grep | grep crond // 查看crond做事是否运行
service crond start //关闭做事
service crond stop //关闭做事
service crond restart //重启做事
service crond reload //重新载入配置
2、用户没有实行crond的权限
vim /etc/cron.deny文件用来掌握哪些用户不能实行crond做事的功能。
可以将自己从文件中删去,或者联系root
3、crontab不供应所实行用户的环境变量
办理方法:在脚本中加入下面这一行:
. /etc/profile
. ~/.bash_profile
4、没有利用绝对路径
这里的绝对路径包括脚本中的路径和crond命令中的路径两个方面,例如:
/10 sh/root/script/mysql_files_monitor.sh&
5、如果上面都没有办理问题的话可以再找找问题:
1)去邮件看看,在这个过程中用户该当会收到邮件,比如收到这样的提示:
vim /var/spool/mail/root
You have mail in /var/spool/mail/root
去看看里面就有crond的内容
文件太大打不开,可以截取末了1000行查看
tail -n 1000 /var/spool/mail/root > aaa.txt && vim aaa.txt
2)在脚本里面加入output用来调试
可以在crontab的脚本里面添加个
echo $PATH > /tmp/test.log
比拟和终端下实行脚本的echo $PATH
6、crond进程太多,全部杀去世重启crond做事
#!/bin/bash
for i in $(ps -elf | grep -v grep | grep crond | awk -F \"大众 \公众 '{print $4}'); do
kill -9 $i
done
利用root实行重启,后问题办理:
service crond restart
7、crond防止脚本周期内未实行完重复实行
个人体会:flock -xn my.lock cmd
my.lock是一个文件,可以是任意文件,可以新建一个空文件
当flock 得到锁后就会实行后面的 cmd
测试过程:
$1: flock -xn my.lock sleep 20
$2: flock -xn my.lock ls
只有当1返回后, 2的ls才会成功
如果某脚本要运行30分钟,可以在Crontab里把脚本间隔设为至少一小时来避免冲突。而比较糟的情形是可能该脚本在实行周期内没有完成,接着第 二个脚本又开始运行了。如何确保只有一个脚本实例运行呢?一个好用的方法是利用lockf(FreeBSD 8.1下为lockf,CentOS 5.5下为flock),在脚本实行前先检测能否获取某个文件锁,以防止脚本运行冲突。
lockf 参数如下
-k:一贯等待获取文件锁。
-s:silent,不发出任何信息,纵然拿不到文件锁。
-t seconds:设定timeout的韶光是seconds秒,如果超过韶光,则自动放弃。
以下crontab操持任务实行前,需获取临时文件create.lock 文件锁,crontab操持任务的内容如下:
1/10 (lockf -s -t 0 /tmp/create.lock/usr/bin/python /home/project/cron/create_tab.py >> /home/project/logs/create.log 2>&1)
若第一个实例在10分钟内没有运行完,第2个实例不会运行。我以前是通过Shell脚本来办理这个问题的,比如用while...do循环,然后放在后台实行。但后来创造其实用flock或lockf方法更为大略。
附上linux下的flock的用法:
flock (util-linux 2.13-pre7)
Usage: flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command...
-s --shared Get a shared lock
#共享锁,在定向为某文件的FD上设置共享锁而未开释锁的韶光内,其他进程试图在定向为此文件的FD上设置独占锁的要求失落败,而其他进程试图在定向为此文件的FD上设置共享锁的要求会成功
-x --exclusive Get an exclusive lock
#独占或排他锁,在定向为某文件的FD上设置独占锁而未开释锁的韶光内,其他进程试图在定向为此文件的FD上设置共享锁或独占锁都会失落败。只要未设置-s参数,此参数默认被设置
-u --unlock Remove a lock
#手动解锁,一样平常情形不必须,当FD关闭时,系统会自动解锁,此参数用于脚本命令一部分须要异步实行,一部分可以同步实行的情形
-n --nonblock Fail rather than wait
#为非壅塞模式,当试图设置锁失落败,采取非壅塞模式,直接返回1,
-w --timeout Wait for a limited amount of time
#设置壅塞超时,当超过设置的秒数,就跳出壅塞,返回1
-o --close Close file descriptor before running command
-c --command Run a single command string through the shell 实行其后的comand
-h --help Display this text
-V --version Display version
举个例子实行如下脚本:
每天23:30的时候实行一个脚本,但是实行前必须要得到排他文件锁,否则无法实行命令
130 23 flock -xn /tmp/test.lock-c '/usr/local/php test.php'
8、; 和 &&差异
“;” 和 “&&”是有差异的
“;”:不管cmd1实行的结果如何,都实行cmd2
“&&”:只有cmd1实行返回的结果是成功的,才实行cmd2
cmd1 && cmd2; cmd3
- cmd1 is executed, if it succeeds, then executecmd2. and then cmd3 (regardless of cmd2 success or not)
- cmd1 is executed, if it fails, then cmd3 (cmd2 won't be executed)
9、如果碰着shell语法缺点
Syntax error: \公众(\公众 unexpected
办理方法:
需指定shell阐明器命令:SHELL=/bin/bash(请拜会上面 crontab编辑示例SHELL=/bin/bash)
或者拜会:LINUX - BASH Syntax Error
如果碰着路径缺点
在 /var/spool/crontab/yanggang 中,添加了如下命令,在日志文件 /var/spool/mail/yanggang 中提示找不到 xxx.sh 路径
30 /home/barry/top800/top10/top10_fruits/top10_all.sh
或
30 bash/home/barry/top800/top10/top10_fruits/top10_all.sh
这是由于你在crontab中利用了绝对路径实行脚本top10_all.sh,因此在脚本top10_all.sh中引用的其它脚本也都须要利用绝对路径,才能被crontab找到并实行。
那么该如何避免绝对路径呢,推举采取如下格式:
30 cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh(推举用此办法)
前辈入该目录,然后在实行脚本;否则,实行脚本中的其它脚本都须要加绝对路径
参考推举:
CentOS 7.2上 crontab 操持任务
linux定时运行命令脚本——crontab
CentOS crontab 定时任务不实行的办理
WordPress定时任务(wp-cron.php)造成主机CPU超标办理办法