【问题标题】:Shell script not running via crontab on Linux Mint [duplicate]Shell 脚本未通过 Linux Mint 上的 crontab 运行 [重复]
【发布时间】:2017-03-31 19:04:38
【问题描述】:

我只是在学习 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 中看到它实际上正在运行,但没有创建输出或日志条目。 系统日志显示:

...
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

感谢大家,我在这里学到了一些东西。正如 Ruslan 指出的那样,我有两个问题:

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

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

【问题讨论】:

  • 您应该在 crontab 中使用 make_ls_files.sh 的完整路径 * * * * * /usr/local/bin/make_ls_files.sh >> /usr/local/bin/make_ls_files_log.log 2>&1
  • @bansi,没必要,如果/usr/local/bin/$PATH
  • @RuslanOsmanov,Cron 的默认路径依赖于实现,并且跨发行版不可靠。所以总是更好地站在更安全的一边。
  • 现在的问题是您的路径有限,不包含date 和其他命令的路径。如果要在PATH 中添加路径,请使用PATH=$PATH:/usr/bin 等,以免丢失当前路径。
  • @fedorqui,真正的问题(除了权限)是他覆盖原来的PATH。如果他附加它们,他就不会遇到这个问题。啊,你还提到了。所以还是在crontab中指定需要的路径,正常使用命令,只是lstar等,而不是建议的/bin/ls,或者/bin/tar

标签: linux bash shell cron


【解决方案1】:

很可能您没有足够的权限写入/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

(就在使用命令之前)。

P.S.:在终端中使用which 命令来检测命令的位置,例如which ls.

【讨论】:

  • 你是对的,我想我没有权限写入/usr/local/bin,更改了日志文件路径,现在得到了输出。请参阅上面的编辑。
  • @B-and-P,包括 /binPATH。在终端中使用which 命令来检查它的位置,例如which ls
  • 啊哈!太好了,谢谢!那么,在 crontab 中定义的路径不是添加到系统范围的路径中,而是被覆盖了吗?
  • @B-and-P,如果你写PATH=your-paths,你会覆盖原来的值。如果您写PATH=$PATH:/your/path,则将路径附加到原始值
猜你喜欢
  • 2020-02-02
  • 2014-10-06
  • 2019-11-24
  • 2014-01-02
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
相关资源
最近更新 更多