如何在crontab中测试程序的存在?

时间:2014-04-20 04:05:02

标签: bash path crontab command-line-interface contextpath

我制作了一个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部分不起作用。有什么想法吗?

2 个答案:

答案 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或工作目录中,它将无法找到。