我只是在学习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?
我将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
为什么ls
和date
不被识别?
多亏了这些,我在这里学到了一些东西。 正如鲁斯兰指出的,我有两个问题:
一切正在工作,最后的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
。