5

我们有以下性质的脚本(在 cron 中)

someScript.sh > /tmp/cronlog/somescript.$(date +%Y%m%d).log 2>&1

现在有没有一种方法someScript.sh可以让我找出输出进入的文件?

该脚本发送带有摘要的电子邮件。同时我想提一下,可以在某某输出文件中找到详细信息 - 在电子邮件中。

我知道if [ -t 1 ]检测标准输出等的构造,但如何获取输出文件名?请注意,我希望这是通用的,以便有人可以更改 cron 中的输出文件并且不需要修改脚本。

4

2 回答 2

9

我能想到的最简单的事情是:

readlink -f /proc/$$/fd/1

$$ 是脚本的 PID(在脚本内部)。在大多数 unix 系统上,/proc/[pid] 是包含进程 [pid] 信息的伪目录。

/proc/[pid]/fd 是一个目录,其中包含进程的打开文件描述符的符号链接列表。fd/0 是输入,fd/1 是脚本的输出,等等。

如果您不重定向输出,readlink 然后会为您提供目标文件或 tty。

当然,如果你想显示它,你必须在标准输出之外的地方显示它,否则它会被重定向!要调试,请尝试 std 错误 (2)。

各种调用在我的盒子上给出了这些结果(script.sh 只是调用 readlink -f /proc/$$/fd/1 >&2)

# ./script.sh
/dev/pts/0

# ./script.sh > /var/tmp/foo
/var/tmp/foo

# ./script.sh | more
/proc/12132/fd/pipe:[916212]
于 2012-04-04T15:31:51.037 回答
4

与其试图找到一个黑客(而且太依赖于平台),不如在这里采取稍微不同的方法。

像这样设置你的 cron 工作:

someScript.sh /tmp/cronlog/somescript.$(date +%Y%m%d).log

即没有和>2>&1(stdout/stderr 流重定向),只需传递具有所需logfile名称的参数。

现在在 someScript.sh 中将流重定向到您的日志文件,如下所示:

LOGFILE=$1
exec &>${LOGFILE}

最后,您可以向您的客户发送消息:

"output details could be found in ${LOGFILE}"
于 2012-04-04T15:49:12.900 回答