首页 » PHP教程 » phpcrontab不履行技巧_Linux下crond 不实行小编告诉你怎么解决

phpcrontab不履行技巧_Linux下crond 不实行小编告诉你怎么解决

访客 2024-12-12 0

扫一扫用手机浏览

文章目录 [+]

但是,让crond来周期性实行脚本发送邮件关照时,碰着了问题,在crontab -e里面加入了实行脚本之后,创造脚本并没有实行。

可是,通过手动实行Shell脚本命令(./mimvp-email.sh)是正常的,由于手动实行脚本可以默认获取Linux的环境变量,但通过Crontab做的定时任务,则无法获取环境变量。

phpcrontab不履行技巧_Linux下crond 不实行小编告诉你怎么解决

剖析了缘故原由,crond不实行的缘故原由紧张有以下几个方面:

phpcrontab不履行技巧_Linux下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超标办理办法

标签:

相关文章

php封装到delphi技巧_关于Delphi的随想

事情往后呢,刚开始用的是dbase,foxbase,开拓了一些数据库管理软件,还是在dos系统上,用过晓军汉卡...。这个期间读了...

PHP教程 2024-12-14 阅读0 评论0