Câu trả lời của tôi là một biến thể của câu trả lời điển hình cho việc tìm kiếm "foobar" trong danh sách 'ps'. Đối số của "-A" "ps" dễ mang theo hơn "phụ", tôi tin, nhưng sự thay đổi này không liên quan đến câu trả lời. Câu trả lời điển hình như thế này:
$ ps -A -ww | grep [f]oobar
Thay vào đó tôi sử dụng mẫu này:
$ ps -A -ww | grep [^]]foobar
Ưu điểm chính là việc viết tập lệnh dựa trên các mẫu này dễ dàng hơn vì bạn chỉ cần nối chuỗi tĩnh "[^]]" với bất kỳ mẫu nào bạn đang tìm kiếm. Bạn không cần phải loại bỏ chữ cái đầu tiên của chuỗi sau đó chèn nó vào giữa các dấu ngoặc vuông và sau đó nối lại chuỗi đó lại với nhau. Khi viết kịch bản trong shell, bạn chỉ cần dán "[^]]" vào trước mẫu mà bạn đang tìm kiếm. Cắt chuỗi trong Bash là một điều xấu xí, vì vậy biến thể của tôi tránh điều đó. Biến thể này cho biết hiển thị các dòng trong đó mẫu khớp với KHÔNG CÓ khung vuông vuông bên phải hàng đầu]. Vì mẫu tìm kiếm để loại trừ một khung vuông thực sự thêm khung vuông vào mẫu nên nó sẽ không bao giờ khớp với chính nó.
Vì vậy, bạn có thể viết một lệnh 'psgrep' di động như sau. Ở đây, tôi thực hiện một số khoản trợ cấp cho sự khác biệt giữa Linux, OS X BSD và các loại khác. Điều này thêm các tiêu đề cột từ 'ps', cung cấp định dạng 'ps' tùy chỉnh hơn phù hợp với các nhu cầu của tôi và hiển thị các quy trình liệt kê thêm, rộng hơn để không bỏ sót đối số dòng lệnh nào. Vâng, hầu hết không được bỏ lỡ. Java là Java, nó thường làm mọi thứ theo cách tồi tệ nhất có thể, do đó, một số dịch vụ java sẽ chạy qua độ dài tối đa được phép của các đối số mà bảng quy trình sẽ theo dõi. Tôi tin rằng đây là 1024 ký tự. Độ dài đơn lệnh được phép bắt đầu một quy trình dài hơn nhiều, nhưng bảng quy trình nhân không bận tâm theo dõi bất cứ thứ gì có độ dài trên 1K. Khi lệnh được bắt đầu, tên lệnh và danh sách đối số là '
psgrep ()
{
pattern=[^]]${1};
case "$(uname -s)" in
Darwin)
ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
;;
Linux)
ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
;;
*) # other UNIX flavors get a minimalist version.
ps -A -ww | grep -i -e ${pattern}
;;
esac
}
ps aux |grep
bằngpgrep
(hoặcpgrep -f
).