Shell Cron作业未启动
我希望每5分钟执行一次cron作业:Shell Cron作业未启动,shell,ubuntu,cron,Shell,Ubuntu,Cron,我希望每5分钟执行一次cron作业: 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /scr_temp/scheduleSpider.sh 在/var/spool/cron/crontab/root cron应该执行一个shell脚本: #!/bin/sh if [ ! -f "sync.txt" ]; then touch "sync.txt" chmod 777 /scr_temp curl someLink fi 这在命令行
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /scr_temp/scheduleSpider.sh
在/var/spool/cron/crontab/root
cron应该执行一个shell脚本:
#!/bin/sh
if [ ! -f "sync.txt" ]; then
touch "sync.txt"
chmod 777 /scr_temp
curl someLink
fi
这在命令行中可以正常工作,但在cron中不行。但是,cron本身是startet,但脚本不会启动
我读过关于路径问题的书,但我并不真正理解它。我设置了一个cron,将一些env数据写入一个文件。这是输出:
HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
SHELL=/bin/sh
如果我在命令行中执行env命令,我将获得路径的以下输出
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
我必须在shell脚本中设置什么路径?首先:可以将第一个字段替换为
*/5
(请参见man 5 crontab)
第二:让cron通过输入
MAILTO将输出发送到您的电子邮件地址=your@email.address
在您的crontab中。如果脚本有任何输出,它将被邮寄。相反,您可能有一个本地邮箱,可以在其中找到cron输出(通常为$MAIL)。cron的更好语法是
*/5 * * * * /scr_temp/scheduleSpider.sh
另外,请检查您的
scheduleSpider.sh
文件的权限。Cron在与您交互执行程序的用户不同的用户下运行,因此Cron可能没有权限。现在请尝试chmod 777
,只是检查一下。您是否通过crontab-e
或编辑crontab文件添加了comand?您应该使用crontab-e
来正确更新它。我建议:
- 检查
是否具有可执行位/scr\u temp/scheduleSpider.sh
- 在脚本中正确设置
,或使用绝对路径执行命令(路径
而不是/bin/touch
)touch
- 指定
文件的绝对路径(或相对于脚本计算)sync.txt
$PATH
很好;别管它。在Ubuntu上,您调用的所有命令(touch
,chmod
,curl
)都在/bin
和/或/usr/bin
中
您是如何设置cron作业的?您是否以root用户身份运行了crontab某个文件
似乎/etc/crontab
是作为root用户运行cron命令的常用机制。在我的Ubuntu系统上,sudocrontab-l
表示没有root的crontab
。运行<代码> Crutabb < /Case>作为根,就像任何非根帐户一样,应该是可以的,但是您可以考虑使用<代码> /ETC/CROTABAB <代码>。请注意,它使用的语法与普通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
。它显示你的命令了吗
临时修改脚本,使其始终生成一些可见的输出。例如,在#之后添加以下内容/垃圾箱/垃圾箱
:
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
?还是您没有向我们显示整个命令?您应该在脚本的绝对路径之前添加/bin/sh
*/5 * * * * /bin/sh /scr_temp/scheduleSpider.sh
除非删除
sync.txt
,否则这看起来实际上只会执行一次操作。您要在哪个cron文件中设置这一行?它看起来应该可以工作。我将它放在/var/spool/cron/crontab/roots中。我必须在shell脚本中设置什么路径?@ArtWorkAD:您根本不必显式地设置$PATH
。默认值>cron作业的$PATH
肯定应该包括包含touch
命令的目录(可以是/bin
,/usr/bin
,或者两者都是).Hm你能把它作为一个答案发布并描述一下吗?我只是没有得到我必须更改的内容…@Codemwnci:不,cron作业与执行crontab
命令的用户在同一个帐户下运行。cron守护进程本身以root用户身份运行,但在调用命令时它会切换到相应的用户帐户。的确,我习惯于这样做一个公司环境,其中crontab由不同于在命令行上运行命令的用户创建。但是,再次阅读这个问题,我怀疑你是对的,用户可能是相同的。好的,当我在脚本顶部放置回音时,我会收到一封带有输出的电子邮件,因此这似乎有效,但为什么触摸和卷曲会起作用不行?试试我建议的其他方法。如果你通过电子邮件获得了echo
的输出,那么你忽略了我的建议,将输出重定向到/tmp
中的一个文件。正如你向我们展示的那样,你的cron作业设计为只运行一次。touch
和curl
应该可以正常工作;你只是没有调用它们而已。我检查sync.txt是否存在,因为现在它不存在,应该执行if块中的代码,应该创建sync,但它不存在,应该执行的curl命令启动一个spider,完成后删除同步文件,以便另一个spider可以启动,我这样做是为了确保一次只有一个spider处于活动状态,这个工作