我正在学习Linux,所以请耐心等待,因为可能忽略了一些明显的东西。我目前正在尝试设置一个cron作业来运行自定义shell脚本。这个脚本从终端运行良好,但不是通过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
脚本从终端(来自任何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中看到它实际上正在运行,但是没有创建输出或日志条目。 syslog显示了这个:
...
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)
关于它为什么不起作用以及如何调试的任何想法?
我将cron作业更改为:
* * * * * make_ls_files.sh 2>>$HOME/crontab.log
现在我到了某处,日志文件在/home/zion/crontab.log
中创建,包含:
/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
答案 0 :(得分:2)
您很可能没有足够的权限来写入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
列表中的目录。
实施例
PATH
注意,您至少需要对日志文件目录执行write(w)和执行(x)权限!
另请注意,您的Cron实现应通过crontab
支持覆盖PATH
环境变量。否则,您应该为所有可执行文件指定绝对路径。您还可以在shell脚本中调整export PATH=$PATH:/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin
,如下所示
which
(在使用命令之前)。
P.S。:在终端中使用which ls
命令来检测命令的位置,例如, {{1}}。