关于nohup启动程序后,nohup.out过大的解决方法

一般百度到都会说:

cp /dev/null nohup.out
cat /dev/null nohup.out

不能简单的删除那个文件,因为linux的文件管理是引用计数法。

可以清空nohup日志,其实关键在于启动时的流输入方式。如果使用>方式,使用上述方法操作后,再次写入时,文件会重新变成原来的大小,而使用>>追加方式,确实可以消除文件的大小。

原因基本描述如下:

linux的文件管理使用fd,用户可以自定义3以上(包括3)的文件,而0,1,2,则对应了3个标准流

0=标准输入流stdin

1=标准输出流stdout

2=标准错误流stderr

shell读取到>时,判断文件是否存在,不存在则创建文件,之后以w方式写入,文件指针只会向后增加。

因此使用>作为nohup的重定向时,文件指针一直向后增加,使用上述两个命令操作nohup.out,操作时确实重写了整个文件,但是在程序的下次输出时,文件的大小又重新变回原来的大小了,这很正常,因为文件的指针还在原来的大小的位置,写入操作时,指针向后偏移“输出内容的大小”,并写入“输出内容”,此时文件不得不重新回到原本的大小,虽然原本的内容已经不见了(此时那些内容的填充为0,类似的操作一次,然后查看nohup文件的16进制表示,就会发现它们全部都是0x00,可以称为文件空洞)

而使用>>方式写入文件时,使用a+方式写入文件,文件指针指向文件的结束符EOF位置。在使用使用上述两个命令操作nohup.out时,文件的结束符确实重新回到了0x00地址,因此可以清空原本的内容,并且不会再创建文件空洞。

### 如何使用 `nohup` 启动 JAR 文件但不创建 `nohup.out` 日志文件 当使用 `nohup` 命令启动应用程序时,默认情况下会将标准输出和标准错误重定向到名为 `nohup.out` 的文件中。如果希望避免创建此默认日志文件,则可以通过显式地重定向输出来实现。 #### 方法一:将输出重定向至 `/dev/null` 通过将标准输出 (`stdout`) 和标准错误 (`stderr`) 重定向到 `/dev/null`,可以防止任何输出被记录下来: ```bash nohup java -jar your-application.jar > /dev/null 2>&1 & ``` 这条命令的作用如下: - `2>&1` 表示将标准错误也重定向到与标准输出相同的位置,即 `/dev/null` - `&` 让程序在后台运行[^1] 这种方法适用于不需要保存任何日志的情况,所有输出都将被丢弃。 #### 方法二:仅捕获错误信息或将日志写入特定位置 如果不希望完全忽略所有的日志信息而是有选择性的处理,比如只保留错误信息或指定其他路径存储日志,那么可以根据需求调整重定向策略: ##### 只记录错误信息 ```bash nohup java -jar your-application.jar >/dev/null 2>error.log & ``` 这里只有标准错误会被重定向到 `error.log` 文件中,而正常的标准输出则被抛弃。 ##### 自定义日志文件 也可以像下面这样把两个流分别指向不同的地方: ```bash nohup java -jar your-application.jar >> custom_output.log 2>>custom_error.log & ``` 这种方式允许更灵活地管理不同类型的日志数据[^2]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值