crontab如何生效(linux下env环境变量引起的crontab不生效解决办法)

本文目录
- linux下env环境变量引起的crontab不生效解决办法
- 如何用crontab每5分钟执行一次
- crontab 如何立即执行
- Linux crontab 命令解释-实例
- linux怎么修改crontab
- crontab-e不生效
- 如何启动crontab
linux下env环境变量引起的crontab不生效解决办法
crontab是linux中一个定时任务功能了,但是小编使用env环境变量之后迫害前的任务计划没效了,下面我们来看看如何解决env环境变量引起的crontab不生效问题.
有朋友说,他写了一个脚本来做计划任务定时备份数据库,但却一直都备份不成功,手动执行脚本也没有问题,而且在/var/log/cron日志里看到成功执行了,但就是没看到备份的数据库文件。
拿了ssh权限,登录之后,看了之后,和他所说的情况一样,脚本执行成功,但没有生成备份。
不过,查了一下发给root的邮件,看到了问题:
Return-Path: root@test.com
X-Original-To: root
Delivered-To: root@test.com
From: root@test.com (Cron Daemon)
To: root@test.com
Subject: Cron root@test sh /data/cron/backup.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: LANG=en_US.UTF-8
X-Cron-Env: SHELL=/bin/sh
X-Cron-Env: HOME=/root
X-Cron-Env: PATH=/usr/bin:/bin
X-Cron-Env: LOGNAME=root
X-Cron-Env: USER=root
Date: Tue, 1 Apr 2014 10:58:01 -0400 (EDT)
Status: R
/data/cron/backup.sh: line 27: mysql: command not found
从上面可以看到,说mysql命令没有找到,于是执行了一下命令:
# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin
这样就知道了问题所在,在crontab里的执行环境变量与root用户设置的环境变量不一致,从上面两个可以看出区别:
crontab里的环境变量:X-Cron-Env: PATH=/usr/bin:/bin
root用户的环境变量:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin
现在我们已经知道了,mysql这个命令是放在/usr/local/mysql/bin下面,而crontab的PATH变量中却没有这一条,所以出现mysql: command not found的问题。
同时,我们可以新建一个脚本,在crontab里验证一下PATH变量:
# vi path.sh
#!/bin/bash
echo $PATH
# 保存后,加入到crontab
# crontab -e
*/1 * * * * /data/path.sh
1分钟后,可以看到:
/usr/bin:/bin
知道了问题,那就好解决了,有两种:
1. 在备份脚本里,手动设置一下,例如:
#!/bin/bash
. /etc/profile
....余下内容...
这里需要“. /etc/profile”,是因为朋友的mysql是自己编译的,把mysql的路径都添加到这里:
PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin
export PATH
2. 直接设置用户的crontab,添加路径/usr/local/mysql/bin,例如:
# crontab -e
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin:/root/bin
MAILTO=root
HOME=/
0 */12 * * * sh /data/cron/backup.sh
保存之后,就可以正常备份了。
另外可以了解一个文件/etc/crontab:
# 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
如何用crontab每5分钟执行一次
一、创建存放shell脚本的文件夹
# mkdir shell
二、编写shell脚本
使用vim、nano、vi等任意文本工具,都可以编写shell脚本。使用“nano test.sh”在当前目录下,创建一个测试shell脚本。shell脚本的后缀习惯性写成“.sh”。
# vim getdata.sh
脚本内容:
#!/bin/sh
Datetime=$(date "+%Y-%m-%d %H:%M:%S")
filelog="/data/shell/std.log"
exec 3《 /data/shell/server.cfg
echo "#######################START############################" 》》
$filelog
while read server 《&3
do
echo "" 》》 $filelog
echo "》》$Datetime , updategetdata -》 $server~" 》》 $filelog
***隐藏网址***
if ;then
echo "》》$Datetime , update getdata success -》 $server~" 》》 $filelog
else
echo "》》$Datetime , updategetdata failed -》 $server~" 》》 $filelog
fi
echo "" 》》 $filelog
echo "" 》》 $filelog
done
echo "############################END#######################" 》》
$filelog
保存退出:wq! 即可生成shell文件 getdata.shell。
三、对shell脚本添加执行权限。
# chmod 755 getdata.sh
由于新建的shell脚本没有执行权限,首先使用“chmod 755 getdata.sh。
四、创建shell脚本依赖的文件
# vim server.cfg (添加接口用到ip号集合)。
格式:
ip
ip
........
# vim std.log
六、执行脚本测试
# ./getdata.sh
七、添加到定时任务
# crontab -e (编写后保存即可生效)。
举例:每5分钟执行一次
*/5 * * * * /bin/bash /data/shell/getdata.sh 》/dev/null 2》&1
八、查看是否添加进去
#crontab -l 。
1.crontab参数
-u:这个参数可以让我们去其他人的crontab,如果没有加上这个参数的话就会开启自己的crontab
crontab -u 使用者名称
-l:可以列出crontab的内容
-r:可以移除crontab
-e:可以使用系统预设的器,开启crontab
-i:可以移除crontab,会跳出系统信息让你再次确定是否移除crontab
2.crontab时间格式说明
minute(分)可以设置0-59分
hour(小时)可以设置0-23小时
day of month(日期)可以设置1-31号
month(月份):可以设置1-12月
day of week(星期):可以设置0-7星期几,其中0和7都代表星期天,或者我们也可以使用名称来表示星期天到星期一,例如sun表示星期天,mon表示星期一等等
3.crontab时间格式范例
1-3表示123
1-9/2表示13579
4.crontab范例
每五分钟执行 */5 * * * *
每小时执行 0 * * * *
每天执行 0 0 * * *
每周执行 0 0 * * 0
每月执行 0 0 1 * *
每年执行 0 0 1 1 *
5.介绍crontab文件
/etc/crontab
在这个文件里并没有记录系统要执行哪些工作,而是记录了下面四个子目录。
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly
这些子目录里存放了一些脚本,到了crontab所指定的时间点,系统就会去执行这些子目录里的脚本。
参考资料
crontab命令详解 .CSDN博客
定时任务(每5分钟执行一次各机房访问接口).CSDN博客
crontab 如何立即执行
* * * * * /bin/date 》》/tmp/date.txt
* * * * * sleep 10; /bin/date 》》/tmp/date.txt
* * * * * sleep 20; /bin/date 》》/tmp/date.txt
* * * * * sleep 30; /bin/date 》》/tmp/date.txt
* * * * * sleep 40; /bin/date 》》/tmp/date.txt
* * * * * sleep 50; /bin/date 》》/tmp/date.txt
每十秒执行,过十秒没看到结果就说明出错了。
另外,可以在脚本里面写一个保存时间到文件,这样就可以测试准确性了。
crontab里面并没有直接执行的命令。
Linux crontab 命令解释-实例
当安装完成操作系统之后,默认便会启动此任务调度命令。
crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
注意: 新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。
而 linux 任务调度的工作主要分为以下两类:
1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置
每一分钟执行一次 /bin/ls:
或者
在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup:
周一到周五每天下午 5:00 寄一封信给 alex@domain.name:
每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha":
或者
每天 20点10分 执行 接口 并将接口输入信息写入video3_semiao.log 日志中
注意: 当程序在你所指定的时间执行后,系统会发一封邮件给当前的用户,显示该程序执行的内容,若是你不希望收到这样的邮件,请在每一行空一格之后加上 》 /dev/null 2》&1 即可,如:
每10秒执行一下脚本 通过sleep 休眠达到一分钟分割的目的
如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。
解决方法:
1、所有命令需要写成绝对路径形式,如: /usr/local/bin/docker。
2、在 shell 脚本开头使用以下代码:
3、在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:
***隐藏网址***
linux怎么修改crontab
1、首先,连接相应linux主机,进入到linux命令行状态下,等待输入shell指令。
2、在linux命令行下输入shell指令:crontab -e。
3、最后,按下回车键执行shell指令,此时会成功进入crontab的模式。
crontab-e不生效
可以试试这个方法: 在命令行输入如下命令: crontab -e 回车,进入定时任务界面,按下“i”键,进入模式,输入如下内容:
* * * * * echo "111111111111"》》/tmp/test.txt 按下“esc”键退出模式,并输入“:wq”保存并退出 此时继续在命令行下输入如下命令: cat /tmp/test.txt 每过一分钟,执行一下上边的命令,发现不断有内容写入,说明定时任务执行了。
如何启动crontab
cron服务是Linux的内置服务,但它不会开机自动启动。可以用以下命令启动和停止服务:
/sbin/service crond start
/sbin/service crond stop
/sbin/service crond restart
/sbin/service crond reload
以上1-4行分别为启动、停止、重启服务和重新加载配置。
要把cron设为在开机的时候自动启动,在 /etc/rc.d/rc.local 脚本中加入 /sbin/service crond start 即可
查看当前用户的crontab,输入 crontab -l;
crontab,输入 crontab -e;
删除crontab,输入 crontab -r

更多文章:
零基础学php培训(昌平IT培训分享学PHP想快点学会要怎么办)
2025年12月27日 23:30
维吉尼亚密码怎么用(令n=26,s=4,密钥k=QEGD,明文串M=computer,用维吉尼亚密码体制对M加密)
2026年4月2日 23:45
下载php的软件(php开发软件有哪些(php用什么软件))
2025年9月22日 21:15
isnull()方法的作用(sqlserver中isnull(@RecIndex,’’) <> ’’是什么意思)
2026年7月2日 14:45
constructed environment翻译(翻译下面这段文字)
2025年9月26日 03:00
spite词组(in spite of中spite是恶意,为什么变成短语是尽管的意思)
2025年9月18日 03:45
datagridview动态添加列(在DataGridView中动态添加combox列)
2026年7月18日 09:00
web服务器控件不包括(web用户控件 的优点和缺点在哪里)
2026年4月12日 16:45
字符串strtok(c语言:如何把字符串分解为一个个的字符)
2025年8月24日 22:45
echo和printf的区别(bash下echo和print的区别在哪里)
2026年9月22日 22:45












