Cách sử dụng lệnh fuser trong Linux

theanh

Administrator
Nhân viên
Giả sử bạn được giao nhiệm vụ xác định các tiến trình bằng một tệp cụ thể rồi giết từng tiến trình một - tất cả những việc này phải được thực hiện từ dòng lệnh. Bạn sẽ làm gì? Vâng, nếu bạn là người mới sử dụng dòng lệnh, tôi chắc rằng bạn sẽ chẳng biết gì cả, chỉ biết hỏi xung quanh để được giúp đỡ.

Nhưng những người chuyên về dòng lệnh có thể sẽ nghĩ rằng một tiện ích dòng lệnh trong Linux cho phép bạn xác định các tiến trình dựa trên các tệp (thư mục hoặc ổ cắm) mà chúng đang truy cập. Không chỉ vậy, công cụ này còn cho phép bạn giết các tiến trình này, do đó bạn không phải sử dụng lệnh kill hoặc killall riêng lẻ. Tiện ích dòng lệnh mà chúng ta đang nói đến là fuser.

Nếu bạn chưa biết về tiện ích này và muốn hiểu cách sử dụng nó, thì không cần tìm đâu xa nữa, vì trong bài viết này, chúng tôi sẽ thảo luận chi tiết về fuser thông qua một số ví dụ dễ hiểu.

Nhưng trước khi tiếp tục, hãy nhớ rằng tất cả các ví dụ, lệnh và hướng dẫn được đề cập trong hướng dẫn này đều đã được thử nghiệm trên Ubuntu 22.04 LTS.

Lệnh fuser của Linux​

Như Tôi đã đề cập ở trên, lệnh fuser chủ yếu được sử dụng để xác định các tiến trình sử dụng tệp, thư mục hoặc ổ cắm. Công cụ này hiển thị PID của các tiến trình đang sử dụng tệp có tên được truyền làm đối số cho lệnh.

Dưới đây là lệnh fuser đang hoạt động ở dạng cơ bản nhất:


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22500%22%20height=%2283%22%3E%3C/svg%3E


Như ảnh chụp màn hình ở trên cho thấy, chúng tôi đã thử sử dụng fuser để biết tiến trình nào đang sử dụng thư mục /home/himanshu và lệnh - trong đầu ra của nó - đã tạo ra một danh sách các ID tiến trình. Cho đến giờ thì mọi thứ vẫn ổn, nhưng có một vài vấn đề ở đây.

Đầu tiên, 'c' được thêm vào mỗi PID là gì? Xem nhanh trang hướng dẫn sử dụng của lệnhcho thấy ở chế độ hiển thị mặc định, lệnh fuser không chỉ hiển thị PID của các tiến trình truy cập tệp hoặc thư mục mà còn hiển thị loại quyền truy cập.

Mỗi loại quyền truy cập được biểu thị bằng một chữ cái:
  • c - thư mục hiện tại.
  • e - tệp thực thi đang chạy.
  • f - tệp đang mở. f bị bỏ qua ở chế độ hiển thị mặc định.
  • F - tệp đang mở để ghi. F bị bỏ qua trong chế độ hiển thị mặc định.
  • r - thư mục gốc.
  • m - tệp được mmap hoặc thư viện được chia sẻ.
Bây giờ, quay lại ví dụ mà chúng ta đang thảo luận, chữ cái 'c' trong đầu ra cho biết tất cả các quy trình có PID được liệt kê trong đầu ra đều đang truy cập thư mục /home/himanshu làm thư mục hiện tại của chúng.

Hãy nhớ rằng một quy trình có thể có nhiều loại quyền truy cập vào một tệp hoặc thư mục. Ví dụ, đầu ra sau đây cho thấy nhiều tiến trình đang truy cập thư mục gốc (/) làm thư mục gốc và thư mục hiện tại của chúng.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22500%22%20height=%22125%22%3E%3C/svg%3E


Cho đến nay, đầu ra fuser mà chúng ta thấy chỉ chứa ID tiến trình và không có gì khác ngoài điều đó. Sẽ tốt hơn nếu tên tiến trình cũng được hiển thị? Vâng, để làm được điều đó, bạn cần sử dụng tùy chọn dòng lệnh -v. Sau đây là một ví dụ:


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22500%22%20height=%22386%22%3E%3C/svg%3E


Tiếp theo, để thêm tên người dùng của chủ sở hữu quy trình vào mỗi PID, hãy sử dụng tùy chọn dòng lệnh -u. Đây là một ví dụ về điều đó:


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22500%22%20height=%22328%22%3E%3C/svg%3E


Lưu ý: Nếu tệp hoặc thư mục đang đề cập nằm trên hệ thống tệp được gắn kết hoặc thiết bị khối, hãy sử dụng tùy chọn dòng lệnh -m. "Tất cả các quy trình truy cập tệp trên hệ thống tệp đó đều được liệt kê", trang hướng dẫn cho biết. "Nếu một tệp thư mục được chỉ định, nó sẽ tự động được đổi thành NAME/. để sử dụng bất kỳ hệ thống tệp nào có thể được gắn kết trên thư mục đó."

Cách giết các tiến trình bằng fuser​

Bây giờ chúng ta đã thảo luận về những điều cơ bản của fuser, hãy đến với nhiệm vụ mà tôi đã đề cập ở phần đầu - cách giết các tiến trình bằng fuser? Hãy lấy một ví dụ đơn giản hơn cho trường hợp này. Những gì tôi sẽ làm là, tôi sẽ chạy một tệp thực thi và trong khi nó đang chạy, tôi sẽ thử giết tiến trình bằng fuser.

Vậy đây là tệp thực thi đã được khởi chạy:


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22397%22%20height=%2252%22%3E%3C/svg%3E


Và đây là lệnh fuser lý tưởng nhất là sẽ kết thúc tiến trình được khởi tạo bởi tệp thực thi test-fuser.
Mã:
fuser -v -k test-fuser
Ồ, trước khi tôi hãy tiếp tục và thực hiện lệnh này, tôi xin nói với bạn rằng tùy chọn dòng lệnh -k sẽ yêu cầu fuser giết tiến trình (hoặc các tiến trình) bằng cách sử dụng tệp hoặc thư mục.

Sau đây là những gì đã xảy ra khi lệnh được đề cập ở trên được thực thi:


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22387%22%20height=%2263%22%3E%3C/svg%3E


Như ảnh chụp màn hình ở trên cho thấy, việc sử dụng tùy chọn dòng lệnh -k với fuser đã giết tiến trình test-fuser. Để đảm bảo lệnh fuser yêu cầu xác nhận của người dùng trước khi kết thúc một tiến trình, hãy sử dụng tùy chọn -i. Xem ví dụ bên dưới:


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22500%22%20height=%22106%22%3E%3C/svg%3E


Sau đây là một số thông tin chi tiết quan trọng liên quan đến fuser mà bạn nên biết khi sử dụng tùy chọn -k:
  • Với -k, lệnh fuser sẽ gửi tín hiệu SIGKILL theo mặc định. Nhưng bạn có thể thay đổi hành vi này bằng cách sử dụng tùy chọn -SIGNAL.
  • Một tiến trình fuser không bao giờ tự hủy nhưng có thể hủy các tiến trình fuser khác.

fuser - các chi tiết khác​

Ngoài thông tin đã đề cập cho đến nay, một số chi tiết khác đáng để ghi nhớ. Tất cả thông tin đó có thể được truy cập bằng cách chuyển đến trang hướng dẫn của lệnh. Ví dụ, sau đây là thông tin mà trang hướng dẫn fuser liệt kê trong phần 'Hạn chế':
Mã:
Processes accessing the same file or file system several times in the
 same way are only shown once.

 If the same object is specified several times on the command line, some
 of those entries may be ignored.

 fuser may only be able to gather partial information unless run with
 privileges. As a consequence, files opened by processes belonging to
 other users may not be listed and executables may be classified as
 mapped only.

 Installing fuser SUID root will avoid problems associated with partial
 information, but may be undesirable for security and privacy reasons.

 udp and tcp name spaces, and UNIX domain sockets can't be searched with
 kernels older than 1.3.78.

 Accesses by the kernel are only shown with the -v option.

 The -k option only works on processes. If the user is the kernel,
 fuser will print an advice, but take no action beyond that.

Kết luận​

Như bạn đã hiểu, fuser là một tiện ích dòng lệnh cực kỳ hữu ích trong Linux. Điểm tốt là công cụ này không khó hiểu cũng như không khó sử dụng, vì vậy ngay cả người mới cũng có thể dễ dàng bắt đầu sử dụng. Một khía cạnh mà chúng tôi không đề cập ở đây là lệnh này cho phép bạn xác định và thậm chí là tắt các tiến trình đang chạy trên các cổng cụ thể, khiến nó trở thành một công cụ khó bỏ qua đối với quản trị viên mạng.
 
Back
Bên trên