|  |      1Devin      2016-01-23 12:47:53 +08:00 via iPhone | 
|      2itsme OP 谢谢楼上,不过我用的是 debian 7.x  脚本手工输入自行也是正常的。 准备稍后去 man cron 看看。 | 
|  |      3Tink PRO 把脚本和 crontab 内容贴出来啊 | 
|  |      4Devin      2016-01-23 12:57:05 +08:00 via iPhone | 
|      5Busy      2016-01-23 13:18:53 +08:00 | 
|  |      6zander      2016-01-23 13:19:33 +08:00 可能是时区的问题。注意 crontab 调用的时区和你 timezone 看到的时区不一样。 | 
|  |      7just1      2016-01-23 13:21:53 +08:00 via Android rm 也要绝对路径吧 | 
|  |      8skydiver      2016-01-23 13:22:57 +08:00  1 不把脚本和 crontab 内容贴出来,说别的都是耍流氓 | 
|  |      947jm9ozp      2016-01-23 13:30:13 +08:00 /var/mail/{设定 cron 的用户名} | 
|  |      1047jm9ozp      2016-01-23 13:30:33 +08:00 补贴代码和错误提示的求助都是耍流氓 | 
|  |      11zdhxiong      2016-01-23 13:32:07 +08:00 估计还是路径没弄好。在 sh 文件里先用 cd $(dirname $0) || exit 1 切换到脚本所在目录,然后统一用相对路径吧。 | 
|      12venster      2016-01-23 13:32:27 +08:00 反正我的 crontab 里面连 cp 都是 /bin/cp | 
|  |      13xuboying      2016-01-23 13:43:53 +08:00 | 
|      14itsme OP 终于 ok 了 之前在 crontab 里面是这样写: */15 * * * * /usr/bin/txt2html.sh 自动执行不成功;手工运行这个 sh 是完全正常。 现在这个 vps 改成这样:*/15 * * * * /bin/bash /usr/bin/txt2html.sh 才正常。 但是我其他 vps 上的脚本文件,例如 myreboot.sh (每天重启之前删除下一些不用的文件)都是采用的第一种写法,也都正常。 另外: debian 7 的 cron 日志开启是这样的(网络上搜索的都不靠谱): cron -L 15 这样就是所有的 cron 日子都记录,包括正常和错误。 | 
|  |      15yumijie      2016-01-23 14:34:18 +08:00 弱弱地问下楼主,查下 crontab -u yourusername -e  是撒样子,能看到设置的任务吗? 我以前刚学的时候发现设置的任务,用户没有权限执行. 这里我只看到你说的命令,所以我想是不是权限问题 | 
|  |      16iyaozhen      2016-01-23 14:34:31 +08:00 | 
|      17itsme OP @Havee 看来和 sh 有关。我还 bash 后正常。 刚刚看到你的回复我试了下 sh /usr/bin/txt2html.sh /usr/bin/txt2html.sh: 18: /usr/bin/txt2html.sh: Syntax error: "(" unexpected 同样 bash /usr/bin/txt2html.sh 不会报错。 这个 txt2html 的脚本是网上找的。原本功能部分我没改动,就是改了 txt 和 html 文件名。 附脚本(挺长) # !/bin/sh file_input='txt.log' file_output='txt2html.html' td_str='' function create_html_head(){ echo -e "<html> <head> <meta http-equiv="Content-Type" > <body> <h1>$file_input</h1>" } function create_table_head(){ echo -e "<table border="1">" } function create_td(){ # if [ -e ./"$1" ]; then echo $1 td_str=`echo $1 | awk 'BEGIN{FS="|"}''{i=1; while(i<=NF) {print "<td>"$i"</td>";i++}}'` echo $td_str # fi } function create_tr(){ create_td "$1" echo -e "<tr> $td_str </tr>" >> $file_output } function create_table_end(){ echo -e "</table>" } function create_html_end(){ echo -e "</body></html>" } function create_html(){ rm -rf $file_output touch $file_output create_html_head >> $file_output create_table_head >> $file_output while read line do echo $line create_tr "$line" done < $file_input create_table_end >> $file_output create_html_end >> $file_output } create_html | 
|      18itsme OP @iyaozhen 好的,以后 crontab 里面是完全不能省,就像楼上说的 cp 命令都要写成 /bin/cp 保险。 sh 文件前面也加上 sh 或者 bash | 
|  |      19Valyrian      2016-01-23 15:03:51 +08:00 via iPad 不写解释器能给你执行就怪了= =… 另外 sh 和 bash 的区别: http://stackoverflow.com/questions/5725296/difference-between-sh-and-bash | 
|      20julyclyde      2016-01-23 15:04:33 +08:00 | 
|  |      21vivisidea      2016-01-23 15:14:08 +08:00 # !/bin/sh  --> #!/bin/bash | 
|  |      23xuboying      2016-01-23 15:24:01 +08:00 via Android shebang 写错了 | 
|  |      24xuboying      2016-01-23 15:24:35 +08:00 via Android 多了空格 | 
|  |      25wangleineo      2016-01-23 15:42:09 +08:00 是不是用 source abc.sh 执行的脚本? | 
|      26itsme OP @Valyrian  debian 我看了 确实是把 sh 连接到 dash 我用的那个脚本估计对 dash 兼容性问题,应该是 bash 兼容,所以脚本原本的解析器#/bin/sh 在 debian 上用 dash 解析报错;换 bash 后正常。 这个应该就是问题所在了。 谢谢。 | 
|  |      28jimmy66      2016-01-23 17:16:35 +08:00 还有就是创建文件的用户和执行 crontab 的用户最好一致,我踩过这样的坑,还有安装 crontab 后没有开启 cron 服务的坑 | 
|  |      29jimmy66      2016-01-23 17:16:41 +08:00 | 
|  |      30qiaoxin      2016-01-23 18:30:28 +08:00 环境变量的坑,脚本里面最好加上 source /etc/profile #!/bin/sh source /etc/profile 或者这样 * * * * * source /etc/profile && /your/shell/path.sh | 
|  |      31qiaoxin      2016-01-23 18:36:02 +08:00 | 
|      32yuchting      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 | 
|      34Bardon      2016-01-24 00:00:11 +08:00 $(/usr/bin/which command)  不是更好?当然,除了自定义的路径 | 
|  |      35uuspider      2016-01-24 02:06:09 +08:00 #!/bin/bash # 脚本说明 IFS= | 
|  |      36uuspider      2016-01-24 02:09:40 +08:00 一个健壮的脚本,一开始就应该把 shebang 、 IFS 、 PATH 设置好: #!/bin/bash # 脚本说明 IFS=' ' PATH=/bin:/usr/bin:... export PATH | 
|      37steveneo      2016-01-24 06:32:51 +08:00 没看到你的脚本,但我知道 Ubuntu 有个 Bug ,就是必须 Cron 文件最后一定要有空行, 有空行,有空行!!!! | 
|      38datocp      2016-01-25 08:24:31 +08:00 via Android 在 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 | 
|  |      39huobazi      2016-01-25 11:09:44 +08:00 | 
|      40xbaofeng      2016-01-25 13:46:34 +08:00 试试换一个 crontab -e 编辑器 vim 的话试试 zz 保存 | 
|  |      41qiaoxin      2016-01-26 20:37:16 +08:00 环境变量的问题可以这样, cronrab -e,最上面加上一行, PATH=/bin:/sbin:/usr/bin:/usr/local/bin 还有其它的就继续添加 | 
|  |      42chanssl      2018-01-22 12:44:05 +08:00 |