Các lệnh thông dụng trên linux để thao tác với file (log)

Có lần gặp sự cố, bạn client ping cho mình “nhờ” mình kiểm tra log server để xem tại thời điểm gặp sự cố, hệ thống có gì lạ không. Mình vốn thật thà: “để từ từ tui hỏi phát, chứ cái này tui cũng chưa rành”, bạn ấy hơi ngạc nhiên “tưởng backend phải giỏi mấy cái này chứ”. Và kết quả là sau khi nhờ “tư vấn” và trace log, mình đã tìm ra được nguyên nhân gây ra lỗi.

Đó chỉ là một trong vô số lần mà mình tìm được nguyên nhân và fix được lỗi nhờ vào “xem” được file log, từ đó mình cũng mặc định luôn, dân backend Java là phải thành thạo linux, không thành thạo là một thiếu sót lớn. Mình cũng đang bị thiếu sót rất lớn này, và vẫn đang học để bổ sung. Và bài viết hôm nay, mình chia sẻ một vài lệnh mà mình hay sử dụng để thao tác trên file cho các bạn mới làm quen với linux:

  • cat: mở và in toàn bộ nội dung file ra màn hình, cái này chỉ thích hợp với file nhỏ, trong trường hợp file lớn thì dùng cat với các lệnh khác để count hoặc để search. Mở file lớn thì dùng head hoặc tail
  • head: mặc định là mở 10 dòng đầu của file, chúng ta có thể sử dụng thêm option -n (với n (number) là số dòng đầu cần xem). VD: head -20 (xem 20 dòng đầu của file)
  • tail: mặc định là mở 10 dòng của cuối của file, tương tự head, chúng ta có thể sử dụng option -n để xem nội dung số dòng cuối của file. Đặc biệt, với option -f (follow), chúng ta có thể xem được nội dung đang được write real time vào file, cái này rất hữu ích khi chúng ta muốn xem file log của chương trình đang chạy, log vẫn đang được ghi vào tại thời điểm xem.
  • grep: in ra dòng với nội dung tìm kiếm. VD: muốn xem nội dung  file log các đoạn có chứa “thachleblog”, mình sử dụng cat /data/log.text | grep “thachleblog”
  • wc: đếm số ký tự / dòng của file, mình hay xài wc -l để đếm số dòng của một file
  • awk: thao tác trên file sribe có format, tùy vào format của dòng log mà ta có thể thao tác để filter data.

VD: mình muốn thống kê xem trong file log.text có bao nhiêu dòng chứa cụm từ “thachleblog” mình có thể dùng lệnh sau:

cat log.text | grep “thachleblog” | wc -l

Để xem mô tả và các option của 1 lệnh linux bất kỳ, chúng ta thường gg, nhưng cũng thể dùng lệnh man để xem nhanh.

VD: gõ man grep để xem mô tả và các option của lệnh grep.

Heap dump trong Java

Đối với các bạn làm backend thì rất có thể sẽ gặp tình huống là khi ứng dụng Java của chúng ta chạy một thời gian, nó sẽ ngốn rất nhiều RAM và càng chạy lâu  thì ngốn càng nhiều hay thậm chí là bị lỗi OutOfMemory. Đến lúc này, việc chúng ta cần làm đó là điều tra nguyên nhân. Để làm được điều này chúng ta cần xem được tại các thời điểm trên, các object nào là nhiều nhất và tốn nhiều bộ nhớ nhất. Java có hỗ trợ chúng ta việc này bằng cách tạo file heap dump. Do đó:

Heap dump là file ghi lại toàn bộ các object của chương trình được tạo ra khi chương trình đang chạy tại một thời điểm.

Có 2 cách để tạo file heap dump:

1. Tự động tạo file heap dump khi chương trình bị OutOfMemory

Chúng ta chỉ cần truyền vào tham số cho JVM:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to this heap dump file>

Nếu chương trình của bạn bị lỗi OutOfMemory, bạn có thể sử dụng cách này để tạo file heap dump. Tuy nhiên, cách này không được khuyến khích, vì chúng ta cần phải chủ động phân tích bộ nhớ trước khi để xảy ra lỗi bằng cách:

2. Tạo file heap dump manual

Đầu tiên các bạn cần xác định pid của ứng dụng bằng cách sử dụng cmd:

ps -ef | grep “app_name”

Sau khi có được pid của ứng dụng thì bạn chỉ việc chạy lện dump của jmap

jmap -dump:live,file=path/name. pid

Ở lệnh trên mình đã lấy được pid của chương trình pkg999c3443

Đến lúc này, chúng ta chỉ việc sử dụng VisualVM để load file dump vừa được tạo và xem thống kê các object được tạo của chương trình tạo thời điểm tạo file dump.

Hình ảnh về các object của ứng dụng pkg999

Tham khảo thêm:

https://dzone.com/articles/memory-analysis-how-to-obtain-java-heat-dump
https://www.ibm.com/support/knowledgecenter/SS3KLZ/com.ibm.java.diagnostics.memory.analyzer.doc/heapdump.html
https://www.javaworld.com/article/2072864/heap-dump-and-analysis-with-visualvm.html