还是 crontab 定时执行问题,真被搞败了

2016-01-23 12:29:08 +08:00
 itsme
https://www.v2ex.com/t/252709 我之前发了个贴,得到大家帮助,解决了。

我后来又重新写了个其他脚本 sh 文件,设置 crontab 自行。脚本里面全部用完整的绝对路径,除了 echo touch rm 这样的命令没用路径开头(这些不用吧)。

自己手工运行,一切正常; crontab 定时就不执行。

另外用的是 debian 系统,没发现哪里有 crontab 的记录,只在 syslog 里面有看到执行时间,是否成功失败没日志。

网络上搜索了下,所谓的开启 cron 的日志功能,也都是 ubantu centos 的,确认都符合我用的 debian 7 系统。

有没有谁能说下 crontab 里面设定执行还有那些方面要注意?
8495 次点击
所在节点    Linux
42 条回复
vivisidea
2016-01-23 15:14:08 +08:00
# !/bin/sh --> #!/bin/bash
xuboying
2016-01-23 15:23:43 +08:00
xuboying
2016-01-23 15:24:01 +08:00
shebang 写错了
xuboying
2016-01-23 15:24:35 +08:00
多了空格
wangleineo
2016-01-23 15:42:09 +08:00
是不是用 source abc.sh 执行的脚本?
itsme
2016-01-23 16:03:43 +08:00
@Valyrian
debian 我看了 确实是把 sh 连接到 dash

我用的那个脚本估计对 dash 兼容性问题,应该是 bash 兼容,所以脚本原本的解析器#/bin/sh 在 debian 上用 dash 解析报错;换 bash 后正常。

这个应该就是问题所在了。

谢谢。
itsme
2016-01-23 16:04:43 +08:00
@julyclyde 是你提到的 2 和 3 的原因。
谢谢了。
jimmy66
2016-01-23 17:16:35 +08:00
还有就是创建文件的用户和执行 crontab 的用户最好一致,我踩过这样的坑,还有安装 crontab 后没有开启 cron 服务的坑
jimmy66
2016-01-23 17:16:41 +08:00
qiaoxin
2016-01-23 18:30:28 +08:00
环境变量的坑,脚本里面最好加上 source /etc/profile
#!/bin/sh
source /etc/profile
或者这样
* * * * * source /etc/profile && /your/shell/path.sh
qiaoxin
2016-01-23 18:36:02 +08:00
还有记得把输出重定向
* * * * * /your/path.sh >/dev/null 2>&1
或者* * * * * /your/path.sh >>/your/path.log 2>>&1
yuchting
2016-01-23 18:48:52 +08:00
我来几个大坑。我都踩过。
1 、重定向放在 crontab -e 中啊,别放在 sh 中,除非 sh 自己有重定向。类似:
0 4 * * 0 /root/frame/restart_weekly.sh >> restart_weekly.log 2>&1

2 、 crontab -e 之前如果修改过 timezone ( cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 这种),编辑 crontab 之后,一定要重启 crond 服务哇, service crond restart. 不然他是按照之前的时区执行的哇。

3 、 sh 一定要加上 export 全路径, sh 一定要加上 export 全路径, sh 一定要加上 export 全路径,重要的事情要说 3 遍, crond 不是 ssh 登陆上起自带路径导入,如果没有事先 export ,貌似好像连 cd ls cp 都找不到滴。
例子:

#!/bin/sh
PATH=/root/jdk1.6.0_45/bin:/usr/local/nginx/sbin:/root/ncftp-3.2.5/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/root/info/
export PATH

pkill -9 java
cd /root/frame
#./backup.sh
./clearAccount.sh
./runServer.sh
skydiver
2016-01-23 18:51:02 +08:00
@yuchting 直接 crontab 里写上 PATH 就行了
Bardon
2016-01-24 00:00:11 +08:00
$(/usr/bin/which command)
不是更好?当然,除了自定义的路径
uuspider
2016-01-24 02:06:09 +08:00
#!/bin/bash
# 脚本说明
IFS=
uuspider
2016-01-24 02:09:40 +08:00
一个健壮的脚本,一开始就应该把 shebang 、 IFS 、 PATH 设置好:

#!/bin/bash
# 脚本说明
IFS='
'
PATH=/bin:/usr/bin:...
export PATH
steveneo
2016-01-24 06:32:51 +08:00
没看到你的脚本,但我知道 Ubuntu 有个 Bug ,就是必须 Cron 文件最后一定要有空行, 有空行,有空行!!!!
datocp
2016-01-25 08:24:31 +08:00
在 debian 只遇到 path 问题,似乎命令写全路径甚至 cd 到脚本路径也无效,至于是 sh 还是 bash 这在脚本的第一行就该定义了

#!/bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin

echo "`(date +"%m/%d/%Y %T")` `free | grep "Mem" | awk 'BEGIN{ORS=""}{ print "Memory Space : Total "$2 " KB";print " Used "$3" KB";print " Free "$4" KB\012";}'`" >> /tmp/log
huobazi
2016-01-25 11:09:44 +08:00
xbaofeng
2016-01-25 13:46:34 +08:00
试试换一个 crontab -e 编辑器
vim 的话试试 zz 保存

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/252810

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX