【发布时间】: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
为什么无法识别ls 和date?
编辑 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中指定需要的路径,正常使用命令,只是ls,tar等,而不是建议的/bin/ls,或者/bin/tar