检索tee命令的基础文件



引用

此处将讨论的内容的完整代码:https://github.com/djon2003/com.cyberinternauts.linux.backup

解决如何登录到文件并屏蔽activateLogs问题:https://stackoverflow.com/a/70792273/214898

限制

只是最后一个问题的一个小提醒:这个脚本是在有限的环境中,在QNAP(NAS(上执行的。

背景

我有一个激活日志记录的功能,现在有三种模式:屏幕、磁盘和两者。在一些帮助下(来自上面链接的问题(,我实现了让工作成为BOTH选项。磁盘&两者都使用编号为3的文件描述符。第一个指向文件,第二个指向stdout。

在我的脚本退出时(使用陷阱(,它会检测是否有记录的错误,并通过电子邮件发送。

代码

function sendErrorMailOnExit()
{
## If errors happened, then send email
local isFileDescriptor3Exist=$(command 2>/dev/null >&3 && echo "Y")
if [ "$isFileDescriptor3Exist" = "Y" ]; then
local logFile=$(readlink /proc/self/fd/3 | sed s/.log$/.err/)
local logFileSize=$(stat -c %s "$logFile")
if [ $logFileSize -gt 0 ]; then
addLog "N" "Sending error email"
local logFileName=$(basename "$logFile")
local logFileContent=$(cat "$logFile")
sendMail "Y" "QNAP - Backup error" "Error happened on backup. See log file $logFileNamennLog error file content:n$logFileContent"
fi
fi
}
trap sendErrorMailOnExit EXIT

问题

正如您所看到的,这很有效,因为文件描述符#3使用的是一个文件。但是现在,使用BOTH选项,文件描述符#3指向stdout,并且该文件是通过tee编写的。因此,我的问题是,如何获得tee文件的位置。

为什么不只使用来自函数activateLogs的变量呢?因为,该函数重新启动脚本,以便能够在调用该函数之前获取所有未捕获的日志。因此,为什么要使用此方法来检索错误文件的位置。

可能的解决方案,但不是最好的(我希望(

  1. 一种方法是通过脚本传递文件位置参数,但如果可以避免的话,我宁愿不这么做
  2. 另一个是创建一个";假的";文件描述符#4(可能是我迄今为止最好的解决方案(,它总是指向文件

有人知道吗?

我最终选择创建一个";假的";文件描述符#4,除了指向当前日志文件之外什么都不做。

相关内容

  • 没有找到相关文章

最新更新