2012-04-04 80 views
5

我们有如下性质(在cron)的脚本有没有在shell脚本中找出其输出重定向的方法?

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

现在是有通过与someScript.sh我可以找出文件的输出中已经的方法吗?

该脚本发送包含摘要的电子邮件。同时,我想提及的是,可以在电子邮件中的某些输出文件中找到详细信息。

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

+1

移动的过程中所涉及的邮件部分包装脚本调用'someScript.sh',检查它是否正确运行,然后发送适当的电子邮件(成功,警告或错误)。 ELSE设置一个logFile var,导出它,用$ logFile替换tmp/...,依赖脚本中的$ {logFile}。祝你好运。 – shellter 2012-04-04 15:22:28

回答

9

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

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

$$是脚本的PID(在脚本中)。在大多数unix系统上,/ proc/[pid]是包含process [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] 
+0

太棒了!我接受了答案。 @huelbois。我希望你能为此得到更多的选票。 – 2012-04-04 15:49:29

+0

我在评论,因为Linux在这里是** NOT **标签。我的Mac上没有'/ proc'。 – anubhava 2012-04-04 15:52:15

+0

Thanx @ring持票人!没有太多的机会在Mac上工作,仅仅花了20天就完成了一个痛苦的项目。不过,你从/ proc伪文件系统中得到了非常有趣的东西,值得看看它。 – huelbois 2012-04-04 16:38:28

4

而不是试图找到一个黑客(和这个平台太依赖了),在这里采取稍微不同的方法更好。

设置你的cron作业是这样的:

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

即没有和>2>&1(标准输出/标准错误流重定向),只是通过与所需logfile名称的参数。

现在里面someScript.sh重定向流这样的日志文件:

LOGFILE=$1 
exec &>${LOGFILE} 

终于可以那么您的邮件客户端:

"output details could be found in ${LOGFILE}"