Shell脚本未在Linux Mint上通过crontab运行

时间:2016-11-17 09:47:04

标签: linux bash shell cron

我正在学习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)

关于它为什么不起作用以及如何调试的任何想法?

编辑01:

我将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

为什么lsdate无法识别?

编辑02

感谢所有人,我在这里学到了一些东西。正如鲁斯兰出去的那样,我有两个问题:

  • 对日志文件位置的权限不足
  • 路径定义不足

现在一切正常,最后的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

1 个答案:

答案 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}}。