Unix / Linux - Quản lý quy trình

Trong chương này, chúng ta sẽ thảo luận chi tiết về quản lý quy trình trong Unix. Khi bạn thực thi một chương trình trên hệ thống Unix của mình, hệ thống sẽ tạo ra một môi trường đặc biệt cho chương trình đó. Môi trường này chứa mọi thứ cần thiết để hệ thống chạy chương trình như thể không có chương trình nào khác đang chạy trên hệ thống.

Bất cứ khi nào bạn đưa ra một lệnh trong Unix, nó sẽ tạo hoặc bắt đầu một quá trình mới. Khi bạn thửlslệnh liệt kê nội dung thư mục, bạn đã bắt đầu một quá trình. Nói một cách đơn giản, một tiến trình là một ví dụ của một chương trình đang chạy.

Hệ điều hành theo dõi các quy trình thông qua một số ID gồm năm chữ số được gọi là pid hoặc là process ID. Mỗi quy trình trong hệ thống có mộtpid.

Pid cuối cùng lặp lại vì tất cả các số có thể đã được sử dụng hết và pid tiếp theo sẽ cuộn hoặc bắt đầu lại. Tại bất kỳ thời điểm nào, không có hai tiến trình nào có cùng pid tồn tại trong hệ thống vì nó là pid mà Unix sử dụng để theo dõi từng tiến trình.

Bắt đầu một quy trình

Khi bạn bắt đầu một quy trình (chạy một lệnh), có hai cách bạn có thể chạy nó:

  • Quy trình tiền cảnh
  • Quy trình nền

Quy trình tiền cảnh

Theo mặc định, mọi quy trình bạn bắt đầu chạy ở chế độ nền trước. Nó nhận đầu vào từ bàn phím và gửi đầu ra đến màn hình.

Bạn có thể thấy điều này xảy ra với lschỉ huy. Nếu bạn muốn liệt kê tất cả các tệp trong thư mục hiện tại của mình, bạn có thể sử dụng lệnh sau:

$ls ch*.doc

Điều này sẽ hiển thị tất cả các tệp, tên của chúng bắt đầu bằng ch và kết thúc bằng .doc -

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

Quá trình chạy ở nền trước, đầu ra được chuyển hướng đến màn hình của tôi và nếu ls lệnh muốn bất kỳ đầu vào nào (mà nó không), nó sẽ đợi nó từ bàn phím.

Trong khi một chương trình đang chạy ở chế độ nền và tốn nhiều thời gian, không thể chạy lệnh nào khác (bắt đầu bất kỳ quá trình nào khác) vì lời nhắc sẽ không khả dụng cho đến khi chương trình hoàn tất xử lý và xuất hiện.

Quy trình nền

Quá trình nền chạy mà không cần kết nối với bàn phím của bạn. Nếu quá trình nền yêu cầu bất kỳ đầu vào bàn phím nào, nó sẽ đợi.

Lợi thế của việc chạy một tiến trình trong nền là bạn có thể chạy các lệnh khác; bạn không cần phải đợi cho đến khi nó hoàn thành để bắt đầu một cái khác!

Cách đơn giản nhất để bắt đầu quy trình nền là thêm dấu và (&) ở cuối lệnh.

$ls ch*.doc &

Điều này hiển thị tất cả những tệp đó tên bắt đầu bằng ch và kết thúc bằng .doc -

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

Đây, nếu ls lệnh muốn bất kỳ đầu vào nào (mà nó không), nó sẽ chuyển sang trạng thái dừng cho đến khi chúng ta di chuyển nó vào nền trước và cung cấp cho nó dữ liệu từ bàn phím.

Dòng đầu tiên chứa thông tin về quy trình nền - số công việc và ID quy trình. Bạn cần biết số công việc để thao tác nó giữa hậu cảnh và tiền cảnh.

Nhấn phím Enter và bạn sẽ thấy như sau:

[1]   +   Done                 ls ch*.doc &
$

Dòng đầu tiên cho bạn biết rằng lsquá trình nền lệnh kết thúc thành công. Thứ hai là lời nhắc cho một lệnh khác.

Quy trình chạy danh sách

Thật dễ dàng để xem các quy trình của riêng bạn bằng cách chạy ps (trạng thái quá trình) lệnh như sau:

$ps
PID       TTY      TIME        CMD
18358     ttyp3    00:00:00    sh
18361     ttyp3    00:01:31    abiword
18789     ttyp3    00:00:00    ps

Một trong những cờ thường được sử dụng cho ps là -f (f cho đầy đủ) tùy chọn, cung cấp thêm thông tin như trong ví dụ sau:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f

Đây là mô tả của tất cả các trường được hiển thị bởi ps -f lệnh -

Sr.No. Cột & Mô tả
1

UID

ID người dùng mà quy trình này thuộc về (người điều hành nó)

2

PID

Xử lý ID

3

PPID

ID quy trình chính (ID của quy trình bắt đầu nó)

4

C

Quá trình sử dụng CPU

5

STIME

Thời gian bắt đầu xử lý

6

TTY

Loại thiết bị đầu cuối liên quan đến quy trình

7

TIME

Thời gian CPU thực hiện bởi quá trình

số 8

CMD

Lệnh bắt đầu quá trình này

Có các tùy chọn khác có thể được sử dụng cùng với ps lệnh -

Sr.No. Tùy chọn & Mô tả
1

-a

Hiển thị thông tin về tất cả người dùng

2

-x

Hiển thị thông tin về các quy trình không có thiết bị đầu cuối

3

-u

Hiển thị thông tin bổ sung như tùy chọn -f

4

-e

Hiển thị thông tin mở rộng

Quá trình dừng

Kết thúc một quá trình có thể được thực hiện theo nhiều cách khác nhau. Thông thường, từ một lệnh dựa trên bảng điều khiển, việc gửi tổ hợp phím CTRL + C (ký tự ngắt mặc định) sẽ thoát khỏi lệnh. Điều này hoạt động khi quá trình đang chạy ở chế độ nền trước.

Nếu một quá trình đang chạy trong nền, bạn sẽ nhận được ID công việc của nó bằng cách sử dụng pschỉ huy. Sau đó, bạn có thể sử dụngkill lệnh để kết thúc quá trình như sau:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

Đây, kill lệnh kết thúc first_onequá trình. Nếu một quy trình bỏ qua lệnh tiêu diệt thông thường, bạn có thể sử dụngkill -9 theo sau là ID quy trình như sau:

$kill -9 6738
Terminated

Quy trình dành cho cha mẹ và con cái

Mỗi quy trình unix có hai số ID được gán cho nó: ID quy trình (pid) và ID quy trình mẹ (ppid). Mỗi quy trình của người dùng trong hệ thống có một quy trình mẹ.

Hầu hết các lệnh mà bạn chạy đều có shell là cha của chúng. Kiểm traps -f ví dụ trong đó lệnh này liệt kê cả ID quy trình và ID quy trình mẹ.

Quá trình xác sống và trẻ mồ côi

Thông thường, khi một quy trình con bị hủy, quy trình mẹ được cập nhật thông qua SIGCHLDtín hiệu. Sau đó, cha mẹ có thể làm một số nhiệm vụ khác hoặc khởi động lại một đứa trẻ mới nếu cần. Tuy nhiên, đôi khi tiến trình cha bị giết trước khi con của nó bị giết. Trong trường hợp này, "cha mẹ của tất cả các quy trình",initquy trình, trở thành PPID mới (ID quy trình mẹ). Trong một số trường hợp, các quy trình này được gọi là quy trình mồ côi.

Khi một quy trình bị hủy, ps danh sách vẫn có thể hiển thị quá trình với Ztiểu bang. Đây là một quá trình zombie hoặc không còn tồn tại. Quá trình này đã chết và không được sử dụng. Các quy trình này khác với các quy trình mồ côi. Họ đã hoàn thành việc thực thi nhưng vẫn tìm thấy một mục nhập trong bảng quy trình.

Quy trình Daemon

Daemon là các quy trình nền liên quan đến hệ thống thường chạy với quyền của root và các yêu cầu dịch vụ từ các quy trình khác.

Một daemon không có thiết bị đầu cuối điều khiển. Nó không thể mở/dev/tty. Nếu bạn làm một"ps -ef" và nhìn vào tty trường, tất cả các daemon sẽ có ? cho tty.

Nói một cách chính xác, daemon là một tiến trình chạy ở chế độ nền, thường chờ đợi điều gì đó xảy ra mà nó có thể hoạt động được. Ví dụ, một trình nền máy in đang chờ lệnh in.

Nếu bạn có một chương trình yêu cầu xử lý dài, thì bạn nên đặt nó làm daemon và chạy nó ở chế độ nền.

Lệnh hàng đầu

Các top lệnh là một công cụ rất hữu ích để nhanh chóng hiển thị các quy trình được sắp xếp theo các tiêu chí khác nhau.

Nó là một công cụ chẩn đoán tương tác cập nhật thường xuyên và hiển thị thông tin về bộ nhớ vật lý và ảo, mức sử dụng CPU, mức trung bình tải và các quy trình bận rộn của bạn.

Đây là cú pháp đơn giản để chạy lệnh hàng đầu và xem số liệu thống kê về việc sử dụng CPU của các quá trình khác nhau -

$top

ID công việc so với ID quy trình

Các quy trình nền và bị treo thường được thao tác job number (job ID). Số này khác với ID quy trình và được sử dụng vì nó ngắn hơn.

Ngoài ra, một công việc có thể bao gồm nhiều tiến trình chạy trong một chuỗi hoặc đồng thời, song song. Sử dụng ID công việc dễ dàng hơn so với theo dõi các quy trình riêng lẻ.