【问题标题】:Linux redirected output not print to the end but the middle of fileLinux重定向输出不是打印到末尾而是文件中间
【发布时间】:2021-03-09 09:42:42
【问题描述】:

这是启动命令:

nohup java $options -jar foo.jar > foo.log 2>&1 &

这样的输出:

...
2020-11-26 21:27:23,577 INFO ...
2020-11-26 21:27:23,577 INFO ...
2020-11-23 12:41:55,783 INFO ...
2020-11-23 12:41:55,783 INFO ...
...

有几行以2020-11-23 开头,始终位于文件末尾。如果java输出更多,文件会变成:

2020-11-26 21:27:23,577 INFO ...
2020-11-26 21:27:23,577 INFO ...
[The New Row]
2020-11-23 12:41:55,783 INFO ...
2020-11-23 12:41:55,783 INFO ...

最后的行总是那些行,你可以通过日期和时间来确认。

更新答案

这就是我的脚本的样子:

...
kill $fooPid
nohup java $options -jar foo.jar > foo.log 2>&1 &
...

kill 不会立即杀死程序,这意味着可能有 2 个程序同时写入同一个文件

为此,我在两个命令之间添加了sleep 0.5

...
kill $fooPid
sleep 0.5
nohup java $options -jar foo.jar > foo.log 2>&1 &
...

然后问题就解决了。

另外,您可以使用kill -9 $fooPid 来立即杀死之前的程序。

(我仍然不知道为什么这些行最后总是来自以前的程序,但现在已经不重要了)

【问题讨论】:

  • 说清楚,你有没有观察到文件在初始状态然后中间出现了一行?或者这是不是按照程序发出的顺序出现的行的问题?对于后者,我猜这是因为 stdout 和 stderr 被独立刷新到文件中。
  • 前一个。最后的行总是那些行,你可以通过日期和时间来确认这一点。 @user14644949
  • 我无法想象这是怎么发生的。它不能只是写入文件中间的情况 - 您必须故意将文件中的行改组以腾出空间。我假设(如您的示例所示)没有任何行被覆盖?
  • 能否请edit提出问题并提供minimal reproducible example

标签: java linux stdout stderr


【解决方案1】:
start program > log
...
kill $pid
start program > log

第二次启动的进程将替换日志文件。如果前一个进程没有被杀死,它现在可以将日志写入新的日志文件。但是后面的进程对此一无所知,它会从位置0写入日志文件。

灵感来自https://unix.stackexchange.com/a/346196

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    相关资源
    最近更新 更多