我制作了一个Bash脚本来测试一个名为“myutility'存在:
#!/bin/bash
#if hash myutility >/dev/null 2>&1; then
if hash myutility 2>/dev/null; then
echo "branch true"
exit 0
else
echo "branch false"
exit 1
fi
在命令行上,
$ ./test.sh
branch true
- 似乎有效。如果我然后将其添加到crontab:
$ crontab -l
## test
* * * * * /Users/meng/bin/test.sh > "/Users/meng/log.txt"
我得到了
$ more /Users/meng/log.txt
branch false
因此,以某种方式从crontab运行脚本时,hash myutility >/dev/null 2>&1
部分不起作用。有什么想法吗?
答案 0 :(得分:1)
了解cronjobs失败的时间和原因可能非常困难。我的解决方案是使用一个包装器脚本,该脚本将存档所有成功的cron作业运行一段时间,并在发生故障时向管理员发送电子邮件。
成功和失败的运行都会将跟踪文件留给磁盘,可以读取该文件以了解作业的作用和时间。在失败时,跟踪被发送给管理员,这样他们就不需要登录到服务器就可以初步了解应该做什么。请注意,当事情失败时,通常最好从下到上阅读通知电子邮件。
#!/bin/bash
#
# Description of your script.
#
# <Begin do not touch header>
# Default settings.
# The trap ERR and pipefail are bashisms, do not change shebang.
JOB_NAME="${0##*/}"
set -e
trap 'echo "${JOB_NAME}: exit on error"; exit 1' ERR
set -u
set -o pipefail
# Report errors by email only when shell is not interactive.
if [ -t 1 ]; then
# Terminal exists, user is running script manually. Do
# not initiate error reporting.
trap 'echo "${0}: exit on error"; exit 1' ERR
else
OUTPUTFILE=$(mktemp "/tmp/${JOB_NAME}.XXXXXXXXX")
exec > "${OUTPUTFILE}" 2>&1
set -x
MAILTO="system-admin-maillist@example.com"
CRONJOBLOGDIR="/tmp/${JOB_NAME}"
SERVER=$(hostname -s)
TIMESTAMP=$(date --iso=ns)
trap "cat "${OUTPUTFILE}" |
mailx -s \"${SERVER}: ${JOB_NAME} failed\" ${MAILTO}" ERR
trap "mv \"${OUTPUTFILE}\" \"${CRONJOBLOGDIR}/${JOB_NAME}.${TIMESTAMP}\"" 0
if [ ! -d "${CRONJOBLOGDIR}" ]; then mkdir -p "${CRONJOBLOGDIR}"; fi
find "${CRONJOBLOGDIR}" -name "${JOB_NAME}.*" -type f -mtime +7 -delete
fi
# </End do not touch header>
#
# WRITE YOUR SCRIPT HERE
#
exit 0
# EOF
答案 1 :(得分:0)
您可能需要在脚本或crontab中提供PATH环境变量。 我的猜测是因为你没有提供一个完整的myutility路径,如果myutility不在PATH或工作目录中,它将无法找到。