我们有以下性质的脚本(在cron中)
someScript.sh > /tmp/cronlog/somescript.$(date +%Y%m%d).log 2>&1
现在有一种方法可以在someScript.sh
中找出输出输入的文件吗?
脚本发送带摘要的电子邮件。同时我想提一下,详细信息可以在输出文件中找到 - 在电子邮件中。
我知道构造if [ -t 1 ]
来检测stdout等但是如何获取输出文件名?
请注意,我希望这是通用的,以便某些人可以在cron中更改输出文件,并且不需要修改脚本。
答案 0 :(得分: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]
答案 1 :(得分: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}"