如何将标准输出重定向到文件并与另一个任务同时从同一文件读取?

如何将标准输出重定向到文件并与另一个任务同时从同一文件读取?

我想在 Ubuntu Linux Bash 中远程运行一个任务(这需要相当长的时间)nohup并重定向stdout到一个文件,例如:

nohup task > out.txt &

我有时想通过查看输出文件来检查任务的进度:

cat out.txt

我还没有弄清楚如何做到这一点,因为只要 Bash 打开文件进行写入,文件的内容就会显示为空。

所以我的问题是:是否有任何允许“共享”stdout重定向的linux命令?

答案1

只要 Bash 打开该文件进行写入,该文件的内容就会显示为空。

事实并非如此。实际情况是,任务缓冲器它的输出——它在内存中累积一段时间,然后分块写入文件。内存缓冲区的固定大小为几千字节。这样做是为了性能,因为每个文件写入都有相对较高的开销。因此,您一开始不会看到程序的输出,但您会看到它一点一点地输出。这与bash无关。

如果你想立即看到输出,你可以开始你的程序 unbuffer(来自expect软件包)。您可以用性能来换取即时性。

第二个问题是,它将cat显示已经发出的输出,并在到达文件末尾后立即退出。如果您想在附加输出时继续读取输出,请使用tail的跟随模式。

nohup unbuffer task >out.txt &
tail -n +1 -f out.txt

Ctrl+C退出tailtail您可以使用less和 其跟随模式代替,(按F;按Ctrl+C停止阅读)。

答案2

看看tee命令,这里有一些例子。

以下命令(在 tee 命令的帮助下)将输出写入屏幕(stdout)和文件。

$ ls | tee file

相关内容