我有一个我想要每5分钟执行一次的cron作业:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /scr_temp/scheduleSpider.sh
在 /var/spool/cron/crontabs/root
cron应该执行shell脚本:
#!/bin/sh
if [ ! -f "sync.txt" ]; then
touch "sync.txt"
chmod 777 /scr_temp
curl someLink
fi
从命令行可以正常工作,但不能从cron工作 . 然而,cron本身是startet但脚本没有启动 .
我读到了路径问题,但我真的不明白 . 我设置了一个将一些env数据写入文件的cron . 这是输出:
HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
SHELL=/bin/sh
如果我在命令行中执行env命令,我会得到以下PATH输出
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
我需要在shell脚本中设置什么路径?
7 回答
你的
$PATH
很好;不要管它 . 在Ubuntu上,您正在调用的所有命令(touch
,chmod
,curl
)都在/bin
和/或/usr/bin
中 .你是怎么设立cron工作的?你是否以root身份运行
crontab some-file
?似乎
/etc/crontab
是以root身份运行cron命令的常用机制 . 在我的Ubuntu系统上,sudo crontab -l
说no crontab for root
. 以root身份运行crontab
,就像对任何非root帐户一样,应该没问题,但您可以考虑使用/etc/crontab
. 请注意,它使用与普通crontab不同的语法,如/etc/crontab
顶部的注释中所述:运行
sudo crontab -l
. 它会显示你的命令吗?暂时修改脚本,使其始终产生一些可见的输出 . 例如,在
#!/bin/sh
之后添加以下内容:几分钟后看看
/tmp/scheduleSpider.sh.log
中的内容 . (您可以将命令设置为每分钟运行一次,这样您就不必等待结果 . )如果可行(应该),您可以在脚本中添加更多echo
命令,以详细查看它正在执行的操作 .看起来您的脚本只能运行一次;它会创建
sync.txt
文件以防止它再次运行 . 这可能是你问题的根源(咳咳) . 你的意图是什么?你的意思是在运行命令后删除sync.txt
,只是忘了这么做?root
在Ubuntu上的主目录是/root
. 您的脚本第一次运行时,应该创建/root/sync.txt
. 该文件是否存在?如果是这样,它多大了?请注意
curl someLink
(假设someLink
是有效的URL)只会将指定链接中的内容转储到标准输出 . 这是你的意图(它会显示为root
的电子邮件吗?或者你只是没有告诉我们整个命令?首先:您可以用
*/5
替换第一个字段(请参阅man 5 crontab)第二个:通过在crontab中输入MAILTO=your@email.address
,将输出邮件发送到您的电子邮件地址 . 如果脚本有任何输出,它将被邮寄 . 而不是那样,你可以有一个本地邮箱,你可以在其中找到cron输出(通常是$ MAIL) .CRON的更好的语法是
另外,请检查
scheduleSpider.sh
文件的权限 . Cron运行的用户与您可能以交互方式执行程序的用户不同,因此可能是cron没有权限 . 现在试试chmod 777
,只是为了检查 .您是否通过
crontab -e
或仅通过编辑crontab文件添加了命令?您应该使用crontab -e
来正确更新它 .您应该在脚本的绝对路径之前添加/ bin / sh .
我建议:
检查
/scr_temp/scheduleSpider.sh
是否具有可执行位在脚本内正确设置
PATH
或使用命令的绝对路径(/bin/touch
而不是touch
)指定
sync.txt
文件的绝对路径(或相对于脚本计算它)在cron脚本中设置工作目录,它可能不会执行您认为应该执行的操作 .