使用tee命令和软链接文件

时间:2015-12-17 06:27:07

标签: linux symlink tee

我有一个脚本start.sh,它运行另一个脚本run.sh. run.sh启动我的可执行文件。

我想记录run.sh的作用,并使用tee命令将其记录到文件loglink,start.sh:

exec run.sh | tee -a loglink

loglink是软链接文件

我有一个逻辑,我有3个日志文件log1.txt log2.txt log3.txt,我需要每个文件的最大大小只有1024字节。因此,在我的代码中,如果log1.txt达到最大大小,我会每5秒检查一次,如果达到最大大小,我将软链接loglink更改为指向log2.txt,与循环方式的log2.txt和log3.txt相同。 / p>

根据我的理解,当我将软链接从log1.txt更改为log2.txt时,tee应该打印到log2.txt,但奇怪的是,tee仍然将输出保存到log1.txt而不是log2.txt

并加上, 我看到ls -l中的softlink发生了变化 我尝试了ls-l | tee loglink,它对log2.txt。

为什么脚本start.sh中的tee无法识别此链接更改? 我在这里错过了一些逻辑吗?

3 个答案:

答案 0 :(得分:1)

简而言之,文件名或符号链接只是程序的代理,用于告诉内核设置内核中真实文件表示的读取或写入路径。

使用file descriptor来表示文件,因为它的源代码(来自freebsd)解释说:

for (exitval = 0; *argv; ++argv)
        if ((fd = open(*argv, append ? O_WRONLY|O_CREAT|O_APPEND :
            O_WRONLY|O_CREAT|O_TRUNC, DEFFILEMODE)) < 0) {
            warn("%s", *argv);
            exitval = 1;
        } else
            add(fd, *argv);

一旦打开文件,在你的情况下,遵循符号链接并打开目标日志文件,之后,打开写入文件的路径,不再需要符号链接或文件名。

答案 1 :(得分:0)

打开文件的程序会保留该文件链接。如果从外部更改链接,则程序不会留下深刻印象并继续写入(或读取)原始文件。

只有当您的程序关闭文件并重新打开它时,它才会使用新链接。

例如,您可以在vlc中打开文件并播放它,然后在播放时将其移动到其他目录。没问题。然后删除它。您现在无法使用新程序打开它,但旧程序正在使用它,直到该程序关闭该文件。

答案 2 :(得分:0)

这是一种正常的行为,正如其他答案中正确解释的那样。 作为解决方案,您应定期在opencloserun.sh输出文件或使用 非常好的utility用于运行时更改其他进程输出:

 reredirect  -m newfile.log  `pidof run.sh`