Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell Cron作业未启动_Shell_Ubuntu_Cron - Fatal编程技术网

Shell 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 这在命令行

我希望每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
这在命令行中可以正常工作,但在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
    文件的绝对路径(或相对于脚本计算)

在cron脚本中设置工作目录,它可能不会执行您认为应该执行的操作。

您的
$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处于活动状态,这个工作