1 crond服务未启动
crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打开它:
crond 或service crond start
如果提示crond命令不存在,可能被误删除了,CentOS下可以通过这个命令重新安装:
yum -y install crontabs
2 权限问题
比如:脚本没有x执行权限,解决方法: 增加执行权限,或者用bash abc.sh的方法执行 也有可能crontab任务所属的用户对某个目录没有写权限,也会失败
3 路径问题
有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径,比如:以root身份登录shell后执行一个/root/test.sh,只要执行
./test.sh
就可以了。但是在crontab中,就会找不到这个脚本,比如写完整:
/root/test.sh
4 时差问题
因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。 时差这个问题还真是搞人,这个我亲身体验了,现象如下:
(1) 我设置了一个定时脚本,用date命令观察服务器的时间到了脚本执行的时间点,发现没有执行
(2) 但是我把脚本设置成每分钟执行一次,就是OK的
见鬼了,服务器时间是对的啊?莫非是要加个什么时区?于是把脚本的时间减10或者12或者8个小时都尝试了下,发现都不行。 但是很明显是时间不一致导致的不执行。
5 变量问题
有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。
1. crond服务未启动 crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。 我们可以先查看一下是否已经启动了服务:
service crond status 1 如下图所示表示crond是正常在运行的,反之说明没有启动
如果没有启动 解决的方法是:
service crond start 1 如果提示crond命令不存在,可能被误删除了,自行百度一下" linux 安装 crontab "
2. 权限问题 比如:脚本没有x执行权限,解决方法: 增加执行权限,或者用bash abc.sh的方法执行 也有可能crontab任务所属的用户对某个目录没有写权限,也会失败
3. 时差问题 因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。 时差这个问题还真是搞人,这个我亲身体验了,现象如下: (1) 我设置了一个定时脚本,用date命令观察服务器的时间到了脚本执行的时间点,发现没有执行 (2) 但是我把脚本设置成每分钟执行一次,就是OK的 见鬼了,服务器时间是对的啊?莫非是要加个什么时区?于是把脚本的时间减10或者12或者8个小时都尝试了下,发现都不行。 但是很明显是时间不一致导致的不执行。 用如下命令修改服务器时区(改成北京时区):
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime service crond restart 1 2 4. 变量问题 有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。或者是自己需要启动的程序出现了异常。
5. 简单的验证方式 可以直接在 crontab 中使用一下方式来测试一下crontab是否能生效。
# 每分钟执行一次,将文本“123”写入到testFile文件中 */1 * * * * echo 123 >> /home/denglinjie/testFile
Linux 查看所有定时任务 crontab 命令选项基本只对用户操作的选项: -u 指定一个用户 -l 列出某个用户的任务计划 -r 删除某个用户的任务 -e 编辑某个用户的任务 所以,要查看所有用户的,只能根据 /etc/passwd 文件中的用户名一一列举了,可以用脚本。
本章内容以CentOS 6.4 ? 和 ? CentOS ?7.6 ?两个版本定时重启Tomcat为例。[6和7的命令不同]
======CentOS 6.4=========
步骤:
一.创建脚本文件,本脚本文件用于停止,重启tomcat运行的java进程,并设置脚本文件权限 1.新建脚本文件tomcat.sh 【注意文件创建的路径】
【查看当前路径的命令: ? pwd】
创建文件命令:
vi tomcat.sh 2.粘贴脚本文件文本内容到文件中: 【注意,标红部分需要自己修改为自己服务器上的对应地址】
【查看linux服务器上JAVA_HOME命令: ?echo $JAVA_HOME 】
【关键一行:
ps -ef|grep java | grep catalina | awk '{print $2} 可以准确定位到当前正在tomcat下启动运行的java进程,而不是安装的java,
参考地址:【linux】linux下准确查询正在tomcat下运行的java进程。准确获取正在运行的java进程的PID - Angel挤一挤 - 博客园 】
#!/bin/bash . /etc/profile
export JAVA_HOME=/usr/local/jdk1.7.0_79 export JRE_HOME=$JAVA_HOME/jre
tomcatPath="/backup/tomcat7" binPath="$tomcatPath/bin" echo "[info][$(date +'%F %H:%M:%S')]正在监控tomcat,路径:$tomcatPath" pid=`ps -ef|grep java | grep catalina | awk '{print $2}'` if [ -n "$pid" ]; then echo "[info][$(date +'%F %H:%M:%S')]正在运行的tomcat进程为:$pid" echo "[info][$(date +'%F %H:%M:%S')]tomcat已经启动,准备使用shutdown命令关闭..." $binPath"/shutdown.sh" sleep 2 pid=`ps -ef|grep java | grep catalina | awk '{print $2}'` if [ -n "$pid" ]; then echo "[info][$(date +'%F %H:%M:%S')]使用shutdown命令关闭失败,准备kill进程..." kill -9 $pid echo "[info][$(date +'%F %H:%M:%S')]kill进程完毕!" sleep 1 else echo "[info][$(date +'%F %H:%M:%S')]使用shutdown命令关闭成功!" fi else echo "[info][$(date +'%F %H:%M:%S')]tomcat未启动!" fi echo "[info][$(date +'%F %H:%M:%S')]准备启动tomcat..." $binPath"/startup.sh" 3.修改脚本文件tomcat.sh 可操作权限 命令:
chmod 777 tomcat.sh 二.修改定时任务配置,添加本脚本到定时任务配置中,启动定时任务 1.修改定时任务配置 命令:
crontab -e 将上面的脚本文件路径,以及定时任务配置粘贴到配置文件中:
58 10 ?* * * /backup/tomcat7/tomcat.sh 【本配置说明: ?每天10:58分 ? 执行脚本文件,脚本文件路径在:/backup/tomcat7/tomcat.sh】
【关于定时任务的配置说明,请自行查阅】
【最后要说明的一点:本命令操作与vi操作文本命令一样】
2.操作定时任务 关闭定时任务命令: service crond stop
启动定时任务命令: service crond start
重启定时任务命令: service crond restart 查看定时任务列表: crontab -l 查看定时任务执行日志: tail -f -n 200 /var/spool/mail/root
3.查看tomcat下运行的java进程是否已经重启 查看命令:
ps -ef|grep java 可以从下图看到,正在运行的新的java进程是在10:58 启动的【说明java进程重启成功】
CentOS 6 使用cron定时任务,报错:Redirecting to /bin/systemctl restart crond.service ?可以查询下面的CentOS 7 使用cron定时任务相关操作。
========CentOS ?7.6========= ?
一.cron任务的自启动相关命令 1.检测cron定时服务是否自启用 systemctl is-enabled crond.service 结果展示如下:
enable表示已启用自启动 disable标识未启用自启动 2.如果未启用,则开启cron自启用 systemctl enable crond.service 3.如果已经启用,想要cron关闭自启动 systemctl disable crond.service
附录: linux系统自带服务的启动文件和状态
二.cron服务是否启动相关命令【区别于自启动】 1.查看cron服务的启动状态 [只有cron的状态是active ?running的,才表示cron服务是启动的]
systemctl status crond.service ? 2.启动cron服务[命令没有提示] systemctl start crond.service 3.停止cron服务[命令没有提示] systemctl stop crond.service 4.重启cron服务[命令没有提示] systemctl restart crond.service 5.重新加载cron服务[命令没有提示] systemctl reload crond.service
三.操作定时任务 1.定时任务的编辑 crontab -e 编辑内容和centos6 一样。表示每天7.30 ?执行 /mnt/apps/tomcat/tomcat.sh 路径下的脚本
30 07 ?* * * /mnt/apps/tomcat/tomcat.sh 如果在上面,已经把定时任务cron启动了,编辑定时任务后,会有提示
如何设定定时时间详见如下描述:
示例:
?0 2 * * * /root/restart_cat.sh >> /root/restart_cat.log 每天2点执行/root/restart_cat.sh脚本并把执行日志追加到/root/restart_cat.log文件中 ?
2.查看已编辑的定时任务 crontab -l
3.删除已编辑的所有定时任务 crontab -r
四.查看定时任务的执行日志 1.查看cron执行日志 tail -f -n 200 /var/log/cron
五.最后总结 如上述命令,整个cron操作步骤如下
1>编辑了.sh脚本,并保存,记录.sh文件所在路径【一定确保.sh脚本可用,可以尝试在编辑完成.sh文件后,直接./tomcat.sh ?执行脚本文件,查看是否可以正常执行】
2>查看并设置cron为自启动
3>查看并启动cron服务,使状态为running
4>编辑并查看cron服务,注意路径和定时格式,确保cron服务编辑成功
5>最后在编辑完成cron服务后,重新加载或重启cron服务,确保cron服务状态是running的
6>最后可以通过查看cron执行日志,确保cron是否执行
7>如果cron任务不执行,确保linux服务器系统 时间 和时区 是否正常
六.cron任务不执行,问题排查 如上,已经确保 ?第五点中所有 步骤都正确执行了。但是cron定时任务一直没有执行。
我这里出现的原因,是因为服务器的时区设置不正确。
正确的时区应该是CST
如果你的时区是UTC,或者其他,就导致时间和时区不正确。
我设置的定时任务是17.05执行,结果等到了17.05,定时任务不执行,因为此刻的系统时间是05.05
解决方法:
【linux】CentOS 查看系统时间,修改时区 - Angel挤一挤 - 博客园
crontab 可以在指定的时间执行一个shell脚本以及执行一系列 Linux 命令。
定时执行shell 脚本 简单给出执行 shell 脚本的步骤。
首先是编写一个测试脚本--test.sh
# 创建脚本 $ vim test.sh # 在脚本中做写入文件操作 date >> data.txt 修改脚本的权限,确保脚本有执行的权限
chmod 777 test.sh 设置 crontab 定时任务
# 打开定时任务配置文件 crontab -e # 在配置文件中写入定时任务的操作, 这里就是指定每天12点定时执行脚本,并把执行脚本的日志写入文件 test.log 0 12 * * * sh test.sh > test.log 保存退出,也就是 :wq
如果有错,linux 会在执行的时候发送一份邮件给你
cat /var/spool/mail/root 注意:
crontab 是运行在系统默认环境里,如果运行的脚本是执行 python 代码,即脚本的内容可能是:
python test.py 这里的 python 会是系统默认的 python 版本,而如果你是运行在 conda 环境里,那么这里就需要采用当前环境里 python 版本的执行文件的绝对路径,即先用以下命令查找当前 python 版本的执行文件位置:
$ which python # 假设输出的文件位置为: /root/anaconda3/py3/bin/python 这里输出的路径,直接替换脚本里的 python:
/root/anaconda3/py3/bin/python test.py 这样才能保证运行不出错,否则可能因为版本问题出错;
crontab命令详解 常用命令 crontab –e ? ? //修改 crontab 文件,如果文件不存在会自动创建。 crontab –l ? ? ?//显示 crontab 文件。 crontab -r ? ? ?//删除 crontab 文件。 crontab -ir ? ? //删除 crontab 文件前提醒用户。 ? ? service crond status ? ? //查看crontab服务状态 service crond start ? ? //启动服务? service crond stop ? ? //关闭服务? service crond restart ? ? //重启服务? service crond reload ? ? //重新载入配置 所以如果需要取消某个定时任务,就是可以删除在配置文件中的对应命令,即 crontab -e 打开文件,然后删除对应哪行的命令即可
基本格式 * * * * * command 分 ?时 ?日 ?月 ?周 ? 命令 第1列表示分钟 00~59 每分钟用*或者 */1表示
第2列表示小时 00~23(0表示0点)
第3列表示日期 01~31
第4列表示月份 01~12
第5列标识号星期 0~6(0表示星期天)
第6列要运行的命令
此外每一列除了数字,还可以有这些符号,其含义如下所示:
* ? ? ? ?代表任何时间,比如第一个 * 就代表一小时中的每分钟都执行 , ? ? ? ?代表不连续的时间,比如 0 8,12,16 * * * 代表每天8,12,16点0分执行 - ? ? ? ?代表连续的时间范围,比如0 5 * * 1-6 代表在周一到周六凌晨5点0分执行 */n ? ? 代表每个多久执行一次,比如*/10 * * * *代表每隔10分钟执行一次 示例 1、在 凌晨00:10运行
10 0 * * * sh test.sh 2、每个工作日23:59都进行备份作业。
59 23 * * 1,2,3,4,5 sh test.sh ?? 或者 ? 59 23 * * 1-5 sh test.sh 3、每分钟运行一次命令
*/1 * * * * sh test.sh 4、每个月的1号 14:10 运行
10 14 1 * * sh test.sh 5、每10分钟定时请求一个地址
0 */10 * * * /usr/bin/curl http://www.aaa.com/index.php 注意,一般最好不要同时采用几号和每周几,可能会出现混淆;
正确、错误日志的输出是否写入到文件方法
1.不输出任何内容(建议使用方法一)
*/1 * * * * /root/XXXX.sh >/dev/null 2>&1? 或 */1 * * * * /root/XXXX.sh &>/dev/null ? ?//&表示任何内容 2.将正确和错误日志都输出到 /tmp/load.log
*/1 * * * * /root/XXXX.sh > /tmp/load.log 2>&1 3.只输出正确日志到 /tmp/load.log
*/1 * * * * /root/XXXX.sh > /tmp/load.log 或 */1 * * * * /root/XXXX.sh 1> /tmp/load.log ? ?//1可以省略 4.只输出错误日志到 /tmp/load.log
*/1 * * * * /root/XXXX.sh 2> /tmp/load.log 部分解释:
/dev/null 代表空设备文件 > 代表重定向到哪里 1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null" 2 表示stderr标准错误 & 表示等同于的意思,2>&1,表示2的输出重定向等同于1 参考文章:
Linux 定时执行shell脚本命令之crontab:https://www.cnblogs.com/wenzheshen/p/8432588.html
linux定时执行sh文件:https://blog.csdn.net/IT_xiaocao/article/details/78206364 ———————————————— 版权声明:本文为CSDN博主「spearhead_cai」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/lc013/article/details/103775702
|