如何旋转nohup.out文件而不杀死我的应用程序


10

我的nohup.out文件增长很快。

我正在后台运行一个应用程序,正在编写nohup.out文件,

现在,我需要旋转nohup.out文件而不杀死我的应用程序。能做到吗?


复制,然后截断。
珍妮·D

他可能会在您建议的这两个操作之间丢失一些宝贵的日志条目。我不推荐它。
Cleankod

Answers:


6

您应该结合使用floglogrotate。如果通过此管道SIGHUP传输应用程序输出,则可以执行flog进程而不必终止正在运行的应用程序。

flog(文件记录器)是一个从STDIN读取输入并写入文件的程序。

如果收到SIGHUP,将重新打开该文件,以允许日志轮换[请参见RH上的logrotate(8)。]

仅当flog检测到发生轮换时(即旧文件消失或inode更改),才会重新打开日志文件。flog非常小(小于500字节的内存占用。)


Nohup可以使用管道代替nohup.out吗?
布莱恩·明顿

1
您可以按照手册页使用文件重定向(>)输出到nohup.out以外的文件:To save output to FILE, use 'nohup COMMAND > FILE'
jas_raj

4

您不能旋转它。您可以使用命令截断它,该命令>nohup.out将删除文件中的所有内容。

如果需要保存输出,可以先复制文件,然后截断文件。但是比赛有一个小窗口,可以在复制文件之后但将其截断之前写入输出。在该窗口期间写入的任何输出将永远丢失。


1
我相信在文件句柄关闭之前,截断不会释放磁盘上的任何空间。
symcbean 2014年

@symcbean您的信念不正确。截断文件会立即释放空间。
kasperd 2014年

Logrotate copytruncate应该可以解决问题。
2014年

@Iain我描述的步骤等效于copytruncatelogrotate。但是nohup.out,很少有文件可以将cron作业配置为旋转文件。
kasperd 2014年

2

你不能

您可以取消链接文件(rm),但是数据仍然在磁盘上有占用空间,只要有打开的文件句柄,数据就将继续被写入。

您可以重命名文件-但这又不会阻止文件被写入(但是如果您定期启动后台作业,则较新的作业将写入同一文件)。

确实,您应该显式地将作业的输出重定向到旨在处理该作业的内容(例如apache rotationlogs)。


logrotate复制截断任何人?
2014年

这完全取决于nohup是否逐行追加到nohup.out或是否维护了指向nohup.out位置的指针。有关示例,请参阅serverfault.com/questions/221337/…
pepoluan 2014年

2

不知道我是否为时已晚。但是对于现在偶然发现这个论坛的其他人来说,我不必尝试用鞭log之类的任何东西。

我的工作就是这样开始的:

nohup <my process> &

这开始我的工作,并开始附加到该目录中的nohup.out。

我要做的就是设置发行版通常随附的logrotate并在 /etc/logrotate.conf

~/my abosolute path/nohup.out {
    size 1024k
    copytruncate
    rotate 100
    maxage 100
}

而且有效!!在同一文件上获取新追加时,nohup.out被截断了。这个过程也没有消亡。nohup.out-20190528这样就创建了一个新的nohup.out 。

希望这可以帮助。


1

Logrotate具有可用的copytruncate选项,该选项将在将指定的文件复制到普通轮换(和压缩,如果设置)中后将其截断(空)。

   copytruncate
          Truncate  the  original log file in place after creating a copy,
          instead of moving the old log file and optionally creating a new
          one,  It  can be used when some program can not be told to close
          its logfile and thus might continue writing (appending)  to  the
          previous log file forever.  Note that there is a very small time
          slice between copying the file and truncating it, so  some  log-
          ging  data  might be lost.  When this option is used, the create
          option will have no effect, as the old log file stays in  place.

logrotate联机帮助页


1

您可以执行以下操作:

cp nohup.out nohup.out.save # save it somewhere
echo "" > nohup.out

您无需杀死您的应用程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.