Linux脚本不能通过crontab运行shell脚本

我只是在学习Linux,所以请耐心等待,因为在这里可能忽略了一些明显的东西。 我目前正在尝试设置一个cron作业来运行一个自定义的shell脚本。 这个脚本在terminal上运行正常,但不能通过cron。 以下是详细信息。 我会感谢来自有经验的用户的任何见解。

系统信息

RELEASE=17.3 CODENAME=rosa EDITION="Cinnamon 64-bit" DESCRIPTION="Linux Mint 17.3 Rosa" DESKTOP=Gnome TOOLKIT=GTK NEW_FEATURES_URL=http://www.linuxmint.com/rel_rosa_cinnamon_whatsnew.php RELEASE_NOTES_URL=http://www.linuxmint.com/rel_rosa_cinnamon.php USER_GUIDE_URL=help:linuxmint GRUB_TITLE=Linux Mint 17.3 Cinnamon 64-bit 

自定义shell脚本

位置: /usr/local/bin/make_ls_files.sh

内容:

 #!/bin/bash # test script to echo ls stout to files # (learning cron jobs) # tilde path not working in cron, trying full path # ls > ~/ls_file_$(date +%F_%H-%M-%S).log ls > /home/zion/ls_file_$(date +%F_%H-%M-%S).log 

脚本从terminal(从任何cwd )运行良好,它输出一个文件/ /home/zion/ls_file_2016-11-17_17-38-37.log输出ls在它。

现在,我已经通过crontab -e设置了一个cron作业:

 # create text files every minute: PATH=/usr:/usr/bin:/usr/local/bin * * * * * make_ls_files.sh >> /usr/local/bin/make_ls_files_log.log 2>&1 

我在syslog中看到它实际上正在运行,但是没有输出或日志条目被创build。 系统日志显示这个:

 ... Nov 17 17:42:01 zion-VirtualBox CRON[4845]: (zion) CMD (make_ls_files.sh >> /usr/local/bin/make_ls_files_log.log 2>&1) Nov 17 17:42:01 zion-VirtualBox CRON[4844]: (CRON) info (No MTA installed, discarding output) Nov 17 17:43:02 zion-VirtualBox CRON[4850]: (zion) CMD (make_ls_files.sh >> /usr/local/bin/make_ls_files_log.log 2>&1) Nov 17 17:43:02 zion-VirtualBox CRON[4849]: (CRON) info (No MTA installed, discarding output) 

任何想法,为什么它不工作,如何debugging?

编辑01:

我将cron作业更改为:

 * * * * * make_ls_files.sh 2>>$HOME/crontab.log 

现在我到了某个地方,日志文件在/home/zion/crontab.log创build,其中包含:

 /usr/local/bin/make_ls_files.sh: line 6: date: command not found /usr/local/bin/make_ls_files.sh: line 6: ls: command not found 

为什么lsdate不被识别?

编辑02

多亏了这些,我在这里学到了一些东西。 正如鲁斯兰指出的,我有两个问题:

  • 日志文件位置的权限不足
  • path定义不足

一切正在工作,最后的cronjob下面:

 # create text files every minute: PATH=/bin:/usr:/usr/bin:/usr/local/bin # * * * * * make_ls_files.sh >> /usr/local/bin/make_ls_files_log.log 2>&1 * * * * * make_ls_files.sh 2 >> $HOME/crontab.log 

很有可能您没有足够的权限来写入/usr/local/bin目录。 通过在终端中运行touch /usr/local/bin/myfile很容易验证。

您应该将错误重定向到一个日志文件,以找出确切的原因。

确保脚本中的所有可执行文件都可以通过PATH ,即进入PATH列表的目录。

 PATH=$PATH:/bin:/usr:/usr/bin:/usr/local/bin * * * * * make_ls_files.sh >> /tmp/make_ls_files_log.log 2>>$HOME/crontab.log 

请注意,您至少需要为日志文件目录写入(w)和执行(x)权限!

还要注意,你的Cron实现应该支持通过crontab覆盖PATH环境变量。 否则,您应该为所有可执行文件指定绝对路径。 您还可以按如下方式在shell脚本中调整PATH

 export PATH=$PATH:/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin 

(就在使用命令之前)。

PS:使用终端中的which命令来检测命令的位置,例如which ls