Lệnh setsid trong Linux

Giới thiệu

Trong lab này, chúng ta sẽ khám phá lệnh setsid của Linux và học cách sử dụng nó để tách một tiến trình khỏi phiên hiện tại và chạy nó ở chế độ nền. Lệnh setsid tạo một phiên mới với tiến trình gọi làm trưởng phiên, cho phép tiến trình chạy độc lập mà không bị ảnh hưởng bởi các tín hiệu hoặc đầu vào/đầu ra của terminal của phiên hiện tại. Chúng ta sẽ bắt đầu bằng cách tìm hiểu lệnh setsid và sau đó trình bày cách sử dụng nó để chạy các tiến trình nền một cách hiệu quả.

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

  • Tìm hiểu lệnh setsid
  • Tách một tiến trình khỏi phiên hiện tại
  • Chạy các tiến trình nền với setsid

Lệnh setsid là một công cụ hữu ích để quản lý các tiến trình trong Linux, và lab này cung cấp các ví dụ thực tế để giúp bạn hiểu và áp dụng nó trong quy trình làm việc hàng ngày của bạn.

Tìm hiểu lệnh setsid

Trong bước này, chúng ta sẽ khám phá lệnh setsid trong Linux, được sử dụng để tách một tiến trình khỏi phiên hiện tại và chạy nó ở chế độ nền.

Lệnh setsid tạo một phiên mới với tiến trình gọi làm trưởng phiên. Điều này có nghĩa là tiến trình sẽ được cô lập khỏi phiên hiện tại và sẽ không bị ảnh hưởng bởi các tín hiệu hoặc đầu vào/đầu ra của terminal của phiên hiện tại.

Hãy bắt đầu bằng cách chạy một lệnh đơn giản bằng cách sử dụng setsid:

setsid sleep 60

Điều này sẽ chạy lệnh sleep 60 trong một phiên mới, và tiến trình sẽ tiếp tục chạy ngay cả khi bạn đóng terminal hiện tại.

Ví dụ đầu ra:

[1] 1234

Đầu ra hiển thị ID tiến trình (PID) của lệnh sleep, đang chạy ở chế độ nền.

Bây giờ, hãy xác minh rằng tiến trình đang chạy trong một phiên riêng biệt:

ps -o sid,pid,cmd | grep sleep

Ví dụ đầu ra:

  1234 1234 sleep 60

Lệnh ps hiển thị rằng tiến trình sleep có ID phiên (SID) khác với phiên hiện tại.

Trong bước tiếp theo, chúng ta sẽ học cách sử dụng setsid để chạy các tiến trình nền hiệu quả hơn.

Tách một tiến trình khỏi phiên hiện tại

Trong bước này, chúng ta sẽ học cách tách một tiến trình khỏi phiên hiện tại bằng cách sử dụng lệnh setsid.

Việc tách một tiến trình khỏi phiên hiện tại rất hữu ích khi bạn muốn chạy một tiến trình chạy dài ở chế độ nền, mà không bị ảnh hưởng bởi các tín hiệu hoặc đầu vào/đầu ra của terminal của phiên hiện tại.

Hãy bắt đầu bằng cách chạy một lệnh đơn giản bằng cách sử dụng setsid:

setsid bash -c 'sleep 60 && echo "Process completed"'

Điều này sẽ chạy lệnh sleep 60 trong một phiên mới, và tiến trình sẽ tiếp tục chạy ngay cả khi bạn đóng terminal hiện tại. Lệnh echo "Process completed" sẽ được thực thi sau khi lệnh sleep hoàn tất.

Ví dụ đầu ra:

[1] 1234

Đầu ra hiển thị ID tiến trình (PID) của lệnh sleep, đang chạy ở chế độ nền.

Bây giờ, hãy xác minh rằng tiến trình đang chạy trong một phiên riêng biệt:

ps -o sid,pid,cmd | grep sleep

Ví dụ đầu ra:

  1234 1234 sleep 60

Lệnh ps hiển thị rằng tiến trình sleep có ID phiên (SID) khác với phiên hiện tại.

Để kiểm tra đầu ra của tiến trình đã tách, chúng ta có thể sử dụng lệnh ps để tìm PID của tiến trình, và sau đó sử dụng lệnh cat để đọc đầu ra từ tệp /proc/<PID>/fd/1 (đại diện cho stdout của tiến trình):

pid=$(ps -o pid,cmd | grep 'sleep 60' | awk '{print $1}')
cat /proc/$pid/fd/1

Ví dụ đầu ra:

Process completed

Điều này cho thấy rằng lệnh echo "Process completed" đã được thực thi sau khi lệnh sleep hoàn tất.

Trong bước tiếp theo, chúng ta sẽ học cách chạy các tiến trình nền hiệu quả hơn bằng cách sử dụng setsid.

Chạy các tiến trình nền với setsid

Trong bước cuối cùng này, chúng ta sẽ học cách sử dụng lệnh setsid để chạy các tiến trình nền một cách hiệu quả trong Linux.

Một trường hợp sử dụng phổ biến của setsid là chạy các tiến trình chạy dài ở chế độ nền, mà không bị ảnh hưởng bởi phiên hiện tại. Điều này đặc biệt hữu ích khi bạn cần chạy một tiến trình nên tiếp tục chạy ngay cả sau khi bạn đăng xuất khỏi hệ thống.

Hãy thử một ví dụ:

setsid bash -c 'while true; do echo "Running in the background" >> ~/project/output.txt; sleep 5; done'

Điều này sẽ bắt đầu một tiến trình nền ghi "Running in the background" vào một tệp có tên output.txt trong thư mục ~/project mỗi 5 giây.

Ví dụ đầu ra:

[1] 1234

Đầu ra hiển thị ID tiến trình (PID) của tiến trình nền.

Bây giờ, hãy xác minh rằng tiến trình đang chạy trong một phiên riêng biệt và tệp đầu ra đang được tạo:

ps -o sid,pid,cmd | grep 'while true'
cat ~/project/output.txt

Ví dụ đầu ra:

  1234 1234 bash -c 'while true; do echo "Running in the background" >> ~/project/output.txt; sleep 5; done'
Running in the background
Running in the background
Running in the background

Lệnh ps hiển thị rằng tiến trình đang chạy trong một phiên riêng biệt, và lệnh cat hiển thị nội dung của tệp output.txt, đang được cập nhật liên tục bởi tiến trình nền.

Ngay cả khi bạn đóng terminal hiện tại, tiến trình nền sẽ tiếp tục chạy và cập nhật tệp output.txt. Bạn có thể kiểm tra tệp sau để xem đầu ra.

Trong lab này, chúng ta đã học cách sử dụng lệnh setsid để tách các tiến trình khỏi phiên hiện tại và chạy chúng ở chế độ nền. Đây là một kỹ thuật hữu ích để quản lý các tiến trình chạy dài trong Linux.

Tóm tắt

Trong lab này, chúng ta đã khám phá lệnh setsid trong Linux, được sử dụng để tách một tiến trình khỏi phiên hiện tại và chạy nó ở chế độ nền. Chúng ta đã học được rằng setsid tạo ra một phiên mới với tiến trình gọi là trưởng phiên, cô lập tiến trình khỏi phiên hiện tại và các tín hiệu hoặc đầu vào/đầu ra của terminal của nó. Chúng ta đã chứng minh cách sử dụng setsid để chạy một lệnh sleep đơn giản ở chế độ nền và cách xác minh rằng tiến trình đang chạy trong một phiên riêng biệt. Ngoài ra, chúng ta đã học cách sử dụng setsid để tách một tiến trình khỏi phiên hiện tại, cho phép các tiến trình chạy dài tiếp tục chạy ngay cả khi terminal hiện tại bị đóng.

400+ câu lệnh phổ biến trong Linux