Tôi sẽ dẫn bạn qua một ví dụ hơi phức tạp, dựa trên một kịch bản đời thực.
Vấn đề
Giả sử lệnh conky
dừng phản hồi trên máy tính để bàn của tôi và tôi muốn giết nó bằng tay. Tôi biết một chút về Unix, vì vậy tôi biết rằng những gì tôi cần làm là thực thi lệnh kill <PID>
. Để lấy PID, tôi có thể sử dụng ps
hoặc top
hoặc bất cứ công cụ phân phối Unix của tôi đã cho tôi. Nhưng làm thế nào tôi có thể làm điều này trong một lệnh?
Câu trả lời
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
TUYÊN BỐ TỪ CHỐI: Lệnh này chỉ hoạt động trong một số trường hợp nhất định. Không sao chép / dán nó vào thiết bị đầu cuối của bạn và bắt đầu sử dụng nó, nó có thể giết chết các quá trình không nghi ngờ. Thay vì học cách xây dựng nó .
Làm thế nào nó hoạt động
1- ps aux
Lệnh này sẽ xuất danh sách các tiến trình đang chạy và một số thông tin về chúng. Thông tin thú vị là nó sẽ xuất ra PID của từng quy trình trong cột thứ 2 của nó. Đây là một trích xuất từ đầu ra của lệnh trên hộp của tôi:
$ ps aux
rahmu 1925 0.0 0.1 129328 6112 ? S 11:55 0:06 tint2
rahmu 1931 0.0 0.3 154992 12108 ? S 11:55 0:00 volumeicon
rahmu 1933 0.1 0.2 134716 9460 ? S 11:55 0:24 parcellite
rahmu 1940 0.0 0.0 30416 3008 ? S 11:55 0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
rahmu 1941 0.0 0.2 160336 8928 ? Ss 11:55 0:00 xfce4-power-manager
rahmu 1943 0.0 0.0 32792 1964 ? S 11:55 0:00 /usr/lib/xfconf/xfconfd
rahmu 1945 0.0 0.0 17584 1292 ? S 11:55 0:00 /usr/lib/gamin/gam_server
rahmu 1946 0.0 0.5 203016 19552 ? S 11:55 0:00 python /usr/bin/system-config-printer-applet
rahmu 1947 0.0 0.3 171840 12872 ? S 11:55 0:00 nm-applet --sm-disable
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:38 conky -q
2- grep conky
Tôi chỉ quan tâm đến một quy trình, vì vậy tôi sử dụng grep
để tìm mục tương ứng với chương trình của mình conky
.
$ ps aux | grep conky
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
rahmu 3233 0.0 0.0 7592 840 pts/1 S+ 16:55 0:00 grep conky
3- grep -v grep
Như bạn có thể thấy trong bước 2, lệnh ps
xuất ra grep conky
quy trình trong danh sách của nó (rốt cuộc đó là một quy trình đang chạy). Để lọc nó, tôi có thể chạy grep -v grep
. Tùy chọn -v
cho biết grep
để khớp với tất cả các dòng không bao gồm các dòng có chứa mẫu.
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
Lưu ý: Tôi rất muốn biết cách thực hiện bước 2 và 3 trong một grep
cuộc gọi.
4- awk '{print $2}'
Bây giờ tôi đã cô lập quá trình mục tiêu của tôi. Tôi muốn lấy lại PID của nó. Nói cách khác, tôi muốn lấy từ thứ 2 của đầu ra. May mắn cho tôi, hầu hết (tất cả?) Các hợp nhất hiện đại sẽ cung cấp một số phiên bản awk
, một ngôn ngữ kịch bản làm nên điều kỳ diệu với dữ liệu dạng bảng. Nhiệm vụ của chúng tôi trở nên dễ dàng như print $2
.
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
Tôi có PID. Tất cả tôi cần là để vượt qua nó kill
. Để làm điều này, tôi sẽ sử dụng xargs
.
xargs kill
sẽ đọc từ đầu vào (trong trường hợp của chúng ta từ đường ống), tạo thành một lệnh bao gồm kill <items>
( <items>
là bất cứ thứ gì nó đọc từ đầu vào), và sau đó thực hiện lệnh được tạo. Trong trường hợp của chúng tôi, nó sẽ thực thi kill 1948
. Nhiệm vụ đã hoàn thành.
Từ cuối cùng
Lưu ý rằng tùy thuộc vào phiên bản unix nào bạn đang sử dụng, một số chương trình nhất định có thể hoạt động khác đi một chút (ví dụ: ps
có thể xuất ra PID trong cột $ 3). Nếu có gì đó không đúng hoặc khác, hãy đọc tài liệu của nhà cung cấp của bạn (hoặc tốt hơn, các man
trang). Cũng nên cẩn thận vì đường ống dài có thể nguy hiểm. Đừng đưa ra bất kỳ giả định nào, đặc biệt là khi sử dụng các lệnh như kill
hoặc rm
. Ví dụ: nếu có một người dùng khác tên là 'conky' (hoặc 'Aconkyous'), lệnh của tôi cũng có thể giết tất cả các quy trình đang chạy của anh ta!
Những gì tôi đang nói là cẩn thận, đặc biệt là đối với đường ống dài. Luôn luôn tốt hơn để xây dựng nó một cách tương tác như chúng ta đã làm ở đây, hơn là đưa ra các giả định và cảm thấy tiếc sau này.