cuốn sách gpt4 ai đã làm

Quá trình java tạo các tệp tmp/tmp* ở trạng thái đã xóa nhưng làm tăng mức sử dụng đĩa trong máy ảo Linux

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 05:09:08 28 4
mua khóa gpt4 Nike

Tôi có một ứng dụng java spring boot triển khai đa luồng, trong đó một luồng đăng ký ZMQ và bốn luồng song song thực hiện một số xử lý trên dữ liệu nhận được dựa trên một số khoảng thời gian định trước. Khi jar đang chạy trên Linux VM và kiểm tra các tệp đang mở bằng lệnh

lsof -s -p

Nó hiển thị tệp loại "tmp/tmp*...(đã xóa)" với mức sử dụng đĩa tăng theo cấp số nhân và cây quy trình cho thấy tệp đó thuộc về một quy trình java đang chạy. Sự cố này chỉ xảy ra trong môi trường máy ảo Linux và không xảy ra trên máy chủ Linux.

Không có trường hợp nào trong mã ứng dụng mà bất kỳ tệp nào như vậy bị xóa mà không bị đóng. Đây là đoạn mã sử dụng xử lý tệp:

Tệp tệp = null;
PrintWriter printWriter = null;
BufferedReader br = null;
FileReader fileReader = null;
FileWriter fileTruncateObject = null;
thử {
file = Tệp mới (filePath);
printWriter = new PrintWriter(file);
cho (T đối tượng: danh sách) {

Chuỗi jsonString = writeJsonString(obj);
if ((jsonString.getBytes().length + file.length()) < 123) {
printWriter.write(jsonString);
printWriter.flush();

}

if ((jsonString.getBytes().length + file.length() >= 123) {
printWriter.close();
fileReader = FileReader mới (tệp);
br = BufferedReader mới(fileReader);
Dữ liệu chuỗi = br.readLine();
// làm gì đó với dữ liệu
br.close();
fileReader.close();
// đọc file thành công, bây giờ đang cắt bớt file và mở đối tượng printwriter mới!
fileTruncateObject = new FileWriter(file, true);
fileTruncateObject.close();
printWriter = new PrintWriter(file);
}

}
} finally {
if (printWriter != null) {
printWriter.close();
}
nếu (br != null) {
thử {
br.close();
} catch (IOException e) {

}
}
if (fileReader != null) {
thử {
fileReader.close();
} catch (IOException e) {

}
}
if (file.exists()) {
thử {
nếu (file.delete()) {
//
}
} catch (Exception e) {
}
}
}

Ngoài ra, ứng dụng còn sử dụng Chính sách cán dựa trên thời gian, với kích thước tối đa là 10 MB, lịch sử tối đa là 15 ngày và các thuộc tính sau:

logging.pattern.console= %d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n
logging.pattern.file= %d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n
logging.level.com.*=DEBUG
logging.path=log
logging.file=${logging.path}//a.%d.log
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
log.file.max-size=10MB
log.file.max-history=15

Tôi không thể đọc nội dung của tệp vì nó đang trong giai đoạn xóa. Ngoài ra, nó nhắm mục tiêu mô tả tệp "2u". có thể đang viết /tmp Đã xảy ra một số lỗi trong quá trình xử lý tệp nhưng làm cách nào để biết những lỗi này là gì và nguyên nhân đằng sau những lỗi này là gì? Có cách nào để tránh tạo ra cái này /tmp hoặc có cách nào để đọc nội dung của tệp này không?

câu trả lời hay nhất

Các lệnh được sử dụng để chạy quy trình java trong máy ảo Linux liên quan đến "nohup" và "tee" của thiết bị xuất chuẩn. Đầu ra trong /tmp/ được đề cập phụ thuộc vào dữ liệu mà quy trình nhận được (khá lớn), do đó nhật ký bắt đầu in trên /tmp/ cũng như thư mục nhật ký được định cấu hình trong tệp thuộc tính. Chỉ cần chuyển hướng thiết bị xuất chuẩn và thiết bị xuất chuẩn của quy trình java có thể giải quyết được vấn đề.

Ví dụ lệnh đúng:

Nohup java jar 2>&1 > dev/null &

Về quy trình java tạo tệp tmp/tmp* ở trạng thái đã xóa, nhưng lại tăng mức sử dụng đĩa trong máy ảo Linux, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/57770611/

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress