对软链接文件使用 tee 命令

Using tee command with soft linked file

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

我想记录下 run.sh 做了什么,我使用 tee 命令将其记录到文件 loglink, start.sh:

exec run.sh | tee -a loglink

loglink 是 soft linked 文件.

我有一个逻辑,我有 3 个日志文件 log1.txt log2.txt log3.txt,我需要每个文件的最大大小仅为 1024 字节。所以在我的代码中,我每 5 秒检查一次 log1.txt 是否达到最大尺寸,如果达到最大尺寸,我将 softlink loglink 更改为指向 log2.txt,与 log2.txt 和 log3.txt 循环方式相同。

据我了解,当我将 softlink 从 log1.txt 更改为 log2.txt 时,tee 应该打印为 log2.txt,但奇怪的是,tee 仍在保存输出到 log1.txt 而不是 log2.txt

此外, 我看到 softlink 在 ls -l 中改变了 我尝试了一些 ls-l | tee loglink,它对 log2.txt。

为什么脚本 start.sh 中的 T 恤无法识别此 link 更改? 我在这里缺少一些逻辑吗?

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

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

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

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

tee 使用 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);

打开一个文件后,在你的例子中,跟着符号link打开目标日志文件,然后打开写入do文件的路径,符号link或不再需要文件名。

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

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