我有一个脚本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无法识别此链接更改? 我在这里错过了一些逻辑吗?
答案 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)
这是一种正常的行为,正如其他答案中正确解释的那样。
作为解决方案,您应定期在open
中close
和run.sh
输出文件或使用
非常好的utility用于运行时更改其他进程输出:
reredirect -m newfile.log `pidof run.sh`