8 lệnh để quản lý hiệu quả các tiến trình trong Linux

Nói chung, có ba trạng thái chính trong vòng đời của một tiến trình ứng dụng: bắt đầu, chạy và dừng. Nếu bạn muốn trở thành một nhà quản trị có năng lực, bạn cần biết cách quản lý cẩn thận từng trạng thái. 8 lệnh sau có thể được sử dụng để quản lý toàn bộ vòng đời của quy trình.

Nếu bạn muốn trở thành một quản trị viên có năng lực, bạn cần biết cách quản lý trạng thái của các quy trình của mình
Nếu bạn muốn trở thành một quản trị viên có năng lực, bạn cần biết cách quản lý trạng thái của các quy trình của mình

Bắt đầu quá trình

Cách dễ nhất để bắt đầu một quá trình là nhập tên của nó vào dòng lệnh và sau đó nhấn Đi vào. Nếu bạn muốn khởi động máy chủ web nginx, hãy nhập Nginx. Có thể bạn sẽ muốn xem phiên bản.

alan@workstation:~ $nginx
 alan@workstation:~ $nginx -v
 nginx version:nginx/1.14.0

Xem đường dẫn thực thi

Bản demo bootstrap ở trên giả định tệp thực thi nằm trong đường dẫn thực thi của bạn. Hiểu được con đường này là chìa khóa để bắt đầu và quản lý các quy trình một cách đáng tin cậy. Quản trị viên thường tùy chỉnh đường dẫn này cho phù hợp với mục đích. Bạn có thể dùng echo $ đường dẫn để xem đường dẫn thực thi

alan@workstation:~ $echo $path
 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

Nào

Sử dụng lệnh nào để xem đường dẫn đầy đủ của tệp thực thi.

alan@workstation:~ $which nginx
 /opt/nginx/bin/nginx

Chúng tôi sẽ sử dụng phần mềm máy chủ web nginx phổ biến làm ví dụ. Giả sử Nginx được cài đặt. Khi bạn chạy lệnh gì nginx Nếu không có gì được trả về, điều đó có nghĩa là không thể tìm thấy nginx vì lệnh chỉ tìm kiếm đường dẫn thực thi mà bạn đã chỉ định. Có ba cách để khắc phục tình trạng không thể bắt đầu quy trình bằng tên. Đầu tiên là nhập đường dẫn đầy đủ:

alan@workstation:~ $/home/alan/web/prod/nginx/sbin/nginx -v
 nginx version:nginx/1.14.0

Giải pháp thứ hai là cài đặt ứng dụng trong một thư mục theo đường dẫn thực thi. Tuy nhiên, điều này đôi khi có thể không thành công, đặc biệt là nếu bạn không có quyền root.

Giải pháp thứ ba là cập nhật biến môi trường của bạn cho đường dẫn thực thi, bao gồm cả thư mục cài đặt cho ứng dụng cụ thể mà bạn muốn sử dụng. Giải pháp này có liên quan đến vỏ. Ví dụ: người dùng bash cần chỉnh sửa dòng Đường dẫn = trong tệp .bashrc.

path="$home/web/prod/nginx/sbin:$path"

Bây giờ lặp lại lệnh echo và lệnh nào hoặc thử kiểm tra phiên bản.

alan@workstation:~ $echo $path
 /home/alan/web/prod/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
 alan@workstation:~ $which nginx
 /home/alan/web/prod/nginx/sbin/nginx
 alan@workstation:~ $nginx -v
 nginx version:nginx/1.14.0

Tiếp tục quá trình

nohup

Nếu bạn đăng xuất hoặc đóng Terminal, quá trình này có thể không tiếp tục. Trong trường hợp cụ thể này, bạn có thể tiếp tục quá trình bằng cách đặt các lệnh nohup trước lệnh bạn muốn chạy. Thêm một điểm đánh dấu ở cuối và quá trình này sẽ chạy trong nền để bạn có thể tiếp tục sử dụng Terminal. Ví dụ bạn muốn chạy myprogram.sh.

nohup myprogram.sh&

nohup trả về PID của quá trình đang chạy.

Quản lý các quy trình đang diễn ra

Mọi quy trình đều có một mã định danh duy nhất (pid). Số này được người dùng sử dụng để quản lý từng quy trình (bạn cũng có thể sử dụng tên quy trình). Có nhiều lệnh khác nhau để kiểm tra trạng thái của một tiến trình đang chạy. Hãy xem nhanh các lệnh này.

ps

Phổ biến nhất là lệnh ps. Đầu ra tiêu chuẩn ps là một danh sách đơn giản của các quá trình đang chạy trong thiết bị đầu cuối hiện tại. Cột đầu tiên chứa PID.

alan@workstation:~ $ps
 pid tty time cmd
 23989 pts/0 00:00:00 bash
 24148 pts/0 00:00:00 ps

Ví dụ: bạn có thể muốn quá trình Nginx bắt đầu sớm hơn. Để làm điều này, bạn phải yêu cầu ps hiển thị tất cả các tiến trình đang chạy (-e) và một danh sách hoàn chỉnh (-f).

alan@workstation:~ $ps -ef
 uid pid ppid c stime tty time cmd
 root 1 0 0 aug18?00:00:10/sbin/init splash
 root 2 0 0 aug18?00:00:00 [kthreadd]
 root 4 2 0 aug18?00:00:00 [kworker/0:0h]
 root 6 2 0 aug18?00:00:00 [mm_percpu_wq]
 root 7 2 0 aug18?00:00:00 [ksoftirqd/0]
 root 8 2 0 aug18?00:00:20 [rcu_sched]
 root 9 2 0 aug18?00:00:00 [rcu_bh]
 root 10 2 0 aug18?00:00:00 [migration/0]
 root 11 2 0 aug18?00:00:00 [watchdog/0]
 root 12 2 0 aug18?00:00:00 [cpuhp/0]
 root 13 2 0 aug18?00:00:00 [cpuhp/1]
 root 14 2 0 aug18?00:00:00 [watchdog/1]
 root 15 2 0 aug18?00:00:00 [migration/1]
 root 16 2 0 aug18?00:00:00 [ksoftirqd/1]
 alan 20506 20496 0 10:39 pts/0 00:00:00 bash
 alan 20520 1454 0 10:39?00:00:00 nginx:master process nginx
 alan 20521 20520 0 10:39?00:00:00 nginx:worker process
 alan 20526 20506 0 10:39 pts/0 00:00:00 man ps
 alan 20536 20526 0 10:39 pts/0 00:00:00 pager
 alan 20564 20496 0 10:40 pts/1 00:00:00 bash

Bạn có thể xem quá trình Nginx trong đầu ra của lệnh ps ở trên. Lệnh này hiển thị gần 300 dòng, nhưng đã được rút ngắn trong ví dụ này. Như bạn có thể tưởng tượng, 300 dòng thông tin tiến độ là một chút khó khăn để xử lý. Bạn có thể chuyển đổi đầu ra này thành grep và bộ lọc để chỉ hiển thị nginx.

alan@workstation:~ $ps -efgrep nginx
 alan 20520 1454 0 10:39?00:00:00 nginx:master process nginx
 alan 20521 20520 0 10:39?00:00:00 nginx:worker process

Bạn có thể nhanh chóng thấy PID là từ Nginx 20520Năm 20521.

pgrep

Lệnh pgrep đơn giản hóa các vấn đề liên quan đến việc gọi grep của chính nó.

alan@workstation:~ $pgrep nginx
 20520
 20521

Giả sử bạn đang ở trong một môi trường được lưu trữ, nhiều người dùng đang chạy một số phiên bản nginx khác nhau. Bạn có thể sử dụng các tùy chọn -u để loại trừ những người khác khỏi đầu ra.

alan@workstation:~ $pgrep -u alan nginx
 20520
 20521

pidof

Một lệnh hữu ích khác là pidof. Điều này sẽ kiểm tra PID của một tệp nhị phân cụ thể ngay cả khi một quá trình khác có cùng tên đang chạy. Để tạo một ví dụ, tôi đã sao chép Nginx của mình vào thư mục thứ hai và bắt đầu bằng tiền tố đường dẫn thích hợp. Trên thực tế, ví dụ này có thể ở một vị trí khác, ví dụ: B. trong các thư mục thuộc về những người dùng khác nhau. Khi hai phiên bản nginx đang chạy, đầu ra pidof sẽ hiển thị tất cả các quy trình.

alan@workstation:~ $ps -efgrep nginx
 alan 20881 1454 0 11:18?00:00:00 nginx:master process ./nginx -p/home/alan/web/prod/nginxsec
 alan 20882 20881 0 11:18?00:00:00 nginx:worker process
 alan 20895 1454 0 11:19?00:00:00 nginx:master process nginx
 alan 20896 20895 0 11:19?00:00:00 nginx:worker process

Nếu bạn sử dụng grep hoặc pgrep, bạn sẽ thấy số PID nhưng bạn có thể không biết đó là phiên bản nào.

alan@workstation:~ $pgrep nginx
 20881
 20882
 20895
 20896

Lệnh pidof có thể được sử dụng để xác định pid của một phiên bản cụ thể của nginx.

alan@workstation:~ $pidof/home/alan/web/prod/nginxsec/sbin/nginx
 20882 20881
 alan@workstation:~ $pidof/home/alan/web/prod/nginx/sbin/nginx
 20896 20895

ở trên

Lệnh top có lịch sử lâu đời, rất hữu ích để trình bày chi tiết các quy trình đang chạy và nhanh chóng xác định các vấn đề như tiêu thụ bộ nhớ. Chế độ xem mặc định được hiển thị bên dưới.

top-11:56:28 up 1 day, 13:37, 1 user, load average:0.09, 0.04, 0.03
 tasks:292 total, 3 running, 225 sleeping, 0 stopped, 0 zombie
 %cpu (s):0.1 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
 kib mem:16387132 total, 10854648 free, 1859036 used, 3673448 buff/cache
 kib swap:0 total, 0 free, 0 used. 14176540 avail mem
  pid user pr ni virt res shr s%cpu%mem time + command
 17270 alan 20 0 3930764 247288 98992 r 0.7 1.5 5:58.22 gnome-shell
 20496 alan 20 0 816144 45416 29844 s 0.5 0.3 0:22.16 gnome-terminal-
 21110 alan 20 0 41940 3988 3188 r 0.1 0.0 0:00.17 top
  1 root 20 0 225564 9416 6768 s 0.0 0.1 0:10.72 systemd
  2 root 20 0 0 0 0 s 0.0 0.0 0:00.01 kthreadd
  4 root 0 -20 0 0 0 i 0.0 0.0 0:00.00 kworker/0:0h
  6 root 0 -20 0 0 0 i 0.0 0.0 0:00.00 mm_percpu_wq
  7 root 20 0 0 0 0 s 0.0 0.0 0:00.08 ksoftirqd/0

Bạn có thể thay đổi khoảng thời gian cập nhật bằng cách nhập các ký tự S. và giây cập nhật ưu tiên. Ví dụ: các tùy chọn có thể được sử dụng để dễ dàng theo dõi tiến trình Nginx mẫu -p và vượt qua pid để gọi hàng đầu. Phiên bản này sạch hơn nhiều.

alan@workstation:~ $top -p20881 -p20882 -p20895 -p20896
 tasks:4 total, 0 running, 4 sleeping, 0 stopped, 0 zombie
 %cpu (s):2.8 us, 1.3 sy, 0.0 ni, 95.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
 kib mem:16387132 total, 10856008 free, 1857648 used, 3673476 buff/cache
 kib swap:0 total, 0 free, 0 used. 14177928 avail mem
 pid user pr ni virt res shr s%cpu%mem time + command
 20881 alan 20 0 12016 348 0 s 0.0 0.0 0:00.00 nginx
 20882 alan 20 0 12460 1644 932 s 0.0 0.0 0:00.00 nginx
 20895 alan 20 0 12016 352 0 s 0.0 0.0 0:00.00 nginx
 20896 alan 20 0 12460 1628 912 s 0.0 0.0 0:00.00 nginx

Trong quá trình quản lý, đặc biệt là khi kết thúc quá trình, điều quan trọng là phải xác định chính xác PID. Nếu top được sử dụng theo cách này, top cũng phải được thông báo về các quá trình mới khi một trong các quá trình đó dừng hoặc một quá trình mới bắt đầu.

Kết thúc quá trình

giết chết

Điều thú vị là không có lệnh dừng. Trên Linux chỉ có lệnh kill. Lệnh kill được sử dụng để gửi tín hiệu đến một tiến trình. Các tín hiệu phổ biến nhất là “sigtm” hoặc là “Dấu hiệu”. Nhưng còn nhiều điều hơn thế. Dưới đây là một số ví dụ có thể được sử dụng để hiển thị danh sách đầy đủ giết -l.

1) sighup 2) sigint 3) sigquit 4) sigill 5) sigtrap
 6) sigabrt 7) sigbus 8) sigfpe 9) sigkill 10) sigusr1
 11) sigsegv 12) sigusr2 13) sigpipe 14) sigalrm 15) sigterm

Chú ý rằng đây là tín hiệu thứ 9 Sigkill. Thông thường bạn gửi một cái gì đó giống như một lệnh giết -9 20896. Tín hiệu tiêu chuẩn là 15 – sigerm. Hãy nhớ rằng nhiều ứng dụng có các phương pháp dừng riêng của chúng. Nginx sử dụng các tùy chọn -S để chuyển đổi các tín hiệu như dừng hoặc tải lại. Nhìn chung, hầu hết người dùng thích sử dụng các phương pháp dành riêng cho ứng dụng để hoàn thành công việc. Tuy nhiên, tôi sẽ chứng minh bằng cách sử dụng lệnh kill để dừng quá trình Nginx 20896 và sau đó sử dụng pgrep để xác minh rằng nó đã dừng. Pid 20896 không còn được hiển thị.

alan@workstation:~ $kill -9 20896
 alan@workstation:~ $pgrep nginx
 20881
 20882
 20895
 22123

pkill

Lệnh pkill tương tự như pgrep ở chỗ nó có thể tìm kiếm theo tên, có nghĩa là bạn cần phải rất cẩn thận khi sử dụng pkill. Trong ví dụ này, nếu bạn chỉ muốn dừng một phiên bản của nginx nginx, có thể bạn sẽ không sử dụng pkill. Bạn có thể chuyển tùy chọn nginx -s stop cho một phiên bản cụ thể để xóa nó hoặc sử dụng grep để lọc tất cả đầu ra ps.

/home/alan/web/prod/nginx/sbin/nginx -s stop
 /home/alan/web/prod/nginxsec/sbin/nginx -s stop

Nếu bạn muốn sử dụng pkill, bạn có thể thêm một tùy chọn -f để pkill sẽ lọc toàn bộ đối số dòng lệnh. Tất nhiên, điều này cũng áp dụng cho pgrep. Vì vậy, khi thực hiện pkill -fTrước hết, bạn có thể sử dụng pgrep -a. Xác nhận nó.

alan@workstation:~ $pgrep -a nginx
 20881 nginx:master process ./nginx -p/home/alan/web/prod/nginxsec
 20882 nginx:worker process
 20895 nginx:master process nginx
 20896 nginx:worker process

Bạn cũng có thể dùng pgrep -f để thu hẹp kết quả của bạn. pkill Dừng quá trình với các thông số tương tự.

alan@workstation:~ $pgrep -f nginxsec
 20881
 alan@workstation:~ $pkill -f nginxsec

Điều quan trọng nhất cần nhớ về pgrep (đặc biệt là pkill) là bạn phải luôn đảm bảo rằng kết quả tìm kiếm của bạn là chính xác. Bằng cách đó, bạn không thể vô tình thỏa hiệp với sự không chính xác.

Hầu hết các lệnh này đều có nhiều tùy chọn, vì vậy bạn nên đọc trang Đàn ông mỗi đơn đặt hàng. Mặc dù hầu hết các lệnh này hiện diện trên các nền tảng như Linux, Solaris và BSD, nhưng có một số khác biệt. Bất cứ khi nào bạn làm việc với dòng lệnh hoặc viết script, hãy luôn kiểm tra chúng và sẵn sàng sửa chúng nếu cần.

Xem thêm:

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *