Lệnh ulimit trong Linux

Giới thiệu

Trong lab này, chúng ta sẽ khám phá lệnh ulimit của Linux, được sử dụng để thiết lập hoặc hiển thị các giới hạn tài nguyên cho các tiến trình. Chúng ta sẽ bắt đầu bằng cách hiểu mục đích và cú pháp của lệnh ulimit, sau đó tìm hiểu cách điều chỉnh các giới hạn tài nguyên cho các tiến trình bằng cách sử dụng nó. Cuối cùng, chúng ta sẽ xem xét các ví dụ thực tế về việc sử dụng ulimit để quản lý hiệu quả tài nguyên hệ thống.

Lab này bao gồm các bước sau:

  1. Hiểu mục đích và cú pháp của lệnh ulimit
  2. Điều chỉnh giới hạn tài nguyên cho các tiến trình bằng cách sử dụng ulimit
  3. Khám phá các ví dụ thực tế về việc sử dụng ulimit

Lệnh ulimit là một công cụ mạnh mẽ để quản lý tài nguyên hệ thống và là một kỹ năng thiết yếu cho các systemadmin và nhà phát triển làm việc với môi trường Linux.

Hiểu mục đích và cú pháp của lệnh ulimit

Trong bước này, chúng ta sẽ tìm hiểu về mục đích và cú pháp của lệnh ulimit trong Linux. Lệnh ulimit được sử dụng để thiết lập hoặc hiển thị các giới hạn tài nguyên cho phiên shell hiện tại hoặc cho các tiến trình được khởi chạy từ shell hiện tại.

Cú pháp chung của lệnh ulimit là:

ulimit [options] [limit]

Ở đây, options là các tùy chọn khác nhau để kiểm soát giới hạn tài nguyên và limit là giá trị được đặt cho tài nguyên được chỉ định.

Một số tùy chọn phổ biến cho lệnh ulimit bao gồm:

  • -a: Hiển thị tất cả các giới hạn tài nguyên hiện tại.
  • -c: Đặt kích thước tối đa của các tệp core được tạo.
  • -d: Đặt kích thước tối đa của phân đoạn dữ liệu của một tiến trình.
  • -f: Đặt kích thước tối đa của các tệp được tạo bởi shell.
  • -n: Đặt số lượng tối đa của các file descriptor đang mở.
  • -s: Đặt kích thước tối đa của phân đoạn stack.
  • -t: Đặt lượng thời gian CPU tối đa tính bằng giây.

Ví dụ: để đặt kích thước tối đa của các tệp core thành 10 MB, bạn có thể sử dụng lệnh sau:

ulimit -c 10240

Điều này sẽ đặt giới hạn kích thước tệp core thành 10 MB (10240 KB).

Ví dụ đầu ra:

$ ulimit -c 10240
$ ulimit -c
10240

Đầu ra cho thấy giới hạn kích thước tệp core đã được đặt thành 10240 KB (10 MB).

Điều chỉnh giới hạn tài nguyên cho các tiến trình bằng cách sử dụng ulimit

Trong bước này, chúng ta sẽ tìm hiểu cách điều chỉnh giới hạn tài nguyên cho các tiến trình bằng cách sử dụng lệnh ulimit. Giới hạn tài nguyên rất quan trọng để kiểm soát tài nguyên hệ thống được sử dụng bởi các tiến trình, chẳng hạn như thời gian CPU, mức sử dụng bộ nhớ và kích thước tệp.

Đầu tiên, hãy tạo một script đơn giản sẽ vượt quá giới hạn tài nguyên mặc định:

#!/bin/bash

## Create a 1 GB file
dd if=/dev/zero of=big_file.txt bs=1M count=1024

Bây giờ, hãy chạy script và xem điều gì xảy ra:

$ ./create_big_file.sh
dd: error writing 'big_file.txt': File size limit exceeded

Script không thành công vì giới hạn kích thước tệp mặc định quá thấp. Chúng ta có thể sử dụng lệnh ulimit để tăng giới hạn kích thước tệp trước khi chạy script:

$ ulimit -f 2097152  ## Set the file size limit to 2 GB
$ ./create_big_file.sh

Lần này, script sẽ có thể tạo tệp 1 GB mà không gặp bất kỳ sự cố nào.

Bạn cũng có thể sử dụng lệnh ulimit để đặt giới hạn cho các tài nguyên khác, chẳng hạn như số lượng tệp đang mở tối đa, kích thước stack tối đa và thời gian CPU tối đa. Ví dụ:

$ ulimit -n 4096  ## Set the maximum number of open files to 4096
$ ulimit -s 8192  ## Set the maximum stack size to 8 MB
$ ulimit -t 300   ## Set the maximum CPU time to 300 seconds

Hãy nhớ rằng các thay đổi được thực hiện bằng ulimit chỉ ảnh hưởng đến phiên shell hiện tại và bất kỳ tiến trình nào được khởi chạy từ đó. Để các thay đổi có tính bền vững, bạn có thể thêm các lệnh ulimit vào script khởi động shell của bạn (ví dụ: .bashrc hoặc .zshrc).

Khám phá các ví dụ thực tế về việc sử dụng ulimit

Trong bước cuối cùng này, chúng ta sẽ khám phá một số ví dụ thực tế về việc sử dụng lệnh ulimit để quản lý tài nguyên hệ thống.

Một trường hợp sử dụng phổ biến cho ulimit là ngăn các tiến trình tiêu thụ quá nhiều bộ nhớ. Hãy tạo một script phân bổ một lượng lớn bộ nhớ:

#!/bin/bash

## Allocate a 1 GB array
big_array=($(seq 1 $((1024 * 1024))))
echo "Array size: ${#big_array[@]} elements"

Bây giờ, hãy chạy script và xem điều gì xảy ra:

$ ./allocate_memory.sh
Array size: 1048576 elements
Segmentation fault

Script không thành công với lỗi segmentation fault vì nó vượt quá giới hạn bộ nhớ mặc định. Hãy sử dụng ulimit để đặt giới hạn bộ nhớ và thử lại:

$ ulimit -v 1048576  ## Set the maximum virtual memory size to 1 GB
$ ./allocate_memory.sh
Array size: 1048576 elements

Lần này, script chạy thành công vì chúng ta đã đặt giới hạn bộ nhớ 1 GB bằng cách sử dụng ulimit.

Một ví dụ thực tế khác là sử dụng ulimit để giới hạn số lượng tiến trình mà người dùng có thể chạy. Điều này có thể hữu ích để ngăn người dùng khởi chạy quá nhiều tiến trình và làm quá tải hệ thống. Hãy tạo một script sinh ra nhiều tiến trình con:

#!/bin/bash

## Spawn 100 child processes
for i in {1..100}; do
  ./allocate_memory.sh &
done
wait

Bây giờ, hãy chạy script và xem điều gì xảy ra:

$ ulimit -u 50  ## Set the maximum number of user processes to 50
$ ./spawn_processes.sh
./spawn_processes.sh: fork: Resource temporarily unavailable

Script không thành công vì chúng ta đã đặt số lượng tiến trình người dùng tối đa thành 50 và nó đã cố gắng sinh ra 100 tiến trình. Hãy tăng giới hạn và thử lại:

$ ulimit -u 100 ## Set the maximum number of user processes to 100
$ ./spawn_processes.sh

Lần này, script chạy thành công vì chúng ta đã tăng giới hạn tiến trình.

Những ví dụ này minh họa cách bạn có thể sử dụng ulimit để quản lý tài nguyên hệ thống và ngăn các tiến trình tiêu thụ quá nhiều tài nguyên, điều này có thể giúp duy trì sự ổn định và hiệu suất tổng thể của hệ thống.

Tóm tắt

Trong lab này, trước tiên chúng ta đã tìm hiểu về mục đích và cú pháp của lệnh ulimit trong Linux, được sử dụng để thiết lập hoặc hiển thị các giới hạn tài nguyên cho phiên shell hiện tại hoặc cho các tiến trình được khởi chạy từ shell hiện tại. Chúng ta đã khám phá các tùy chọn phổ biến như đặt kích thước tối đa của các tệp core, phân đoạn dữ liệu và các file descriptor đang mở. Tiếp theo, chúng ta đã chứng minh cách điều chỉnh giới hạn tài nguyên cho các tiến trình bằng cách sử dụng lệnh ulimit, vì nó rất quan trọng để kiểm soát tài nguyên hệ thống được sử dụng bởi các tiến trình. Chúng ta đã tạo một script cố gắng tạo một tệp lớn, nhưng không thành công do giới hạn kích thước tệp mặc định, và sau đó sử dụng ulimit để tăng giới hạn kích thước tệp để cho phép script hoàn thành thành công.

Last Updated : 10/05/2025