我有一个我想要每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脚本中设置哪条路径?
答案 0 :(得分:4)
你的$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
顶部的注释中所述:
$ head -5 /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
运行sudo crontab -l
。它会显示你的命令吗?
暂时修改脚本,使其始终产生一些可见的输出。例如,在#!/bin/sh
:
echo "Running scheduleSpider.sh at \`date\`" >> /tmp/scheduleSpider.sh.log
并在几分钟后查看/tmp/scheduleSpider.sh.log
中的内容。 (您可以将命令设置为每分钟运行一次,这样您就不必等待结果。)如果可行(应该),您可以向脚本添加更多echo
命令以详细了解它正在做。
看起来您的脚本只能运行一次;它会创建sync.txt
文件以防止它再次运行。这可能是你问题的根源(咳咳)。你的意图是什么?你的意思是在运行命令后删除sync.txt
,而忘记这样做了吗?
root
在Ubuntu上的主目录是/root
。您的脚本第一次运行时,应该创建/root/sync.txt
。该文件存在吗?如果是这样,它多大了?
请注意,curl someLink
(假设someLink
是有效的URL)只会将指定链接中的内容转储到标准输出。这是你的意图(它会显示为root
的电子邮件吗?或者你只是没有向我们展示整个命令?
答案 1 :(得分:2)
首先:你可以用*/5
替换第一个字段(参见man 5 crontab)
第二:通过在crontab中输入MAILTO=your@email.address
,将输出邮件发送到您的电子邮件地址。如果脚本有任何输出,它将被邮寄。取而代之的是,您可以在本地邮箱中找到cron输出(通常为$ MAIL)。
答案 2 :(得分:1)
CRON的更好语法是
*/5 * * * * /scr_temp/scheduleSpider.sh
另外,请检查scheduleSpider.sh
文件的权限。 Cron运行的用户不同于您可能以交互方式执行程序的用户,因此可能是cron没有权限。立即尝试chmod 777
,只需查看。
答案 3 :(得分:1)
我建议:
/scr_temp/scheduleSpider.sh
是否具有可执行位PATH
或使用绝对路径命令(/bin/touch
而不是touch
)sync.txt
文件的绝对路径(或相对于脚本计算)答案 4 :(得分:0)
您是通过crontab -e
添加命令还是仅通过编辑crontab文件?您应该使用crontab -e
来正确更新。
答案 5 :(得分:0)
您应该在脚本的绝对路径之前添加/ bin / sh。
*/5 * * * * /bin/sh /scr_temp/scheduleSpider.sh
答案 6 :(得分:-1)
在cron脚本中设置工作目录,它可能不会执行您认为应该执行的操作。