Bash script để tìm và giết một quá trình với các đối số nhất định?


17

Tôi muốn một tập lệnh giết chết (các) cá sshthể được chạy với đối số -D (thiết lập proxy cục bộ).

Theo cách thủ công, tôi làm ps -A | grep -i ssh, tìm kiếm (các) ví dụ với -D và kill -9 {id}mỗi ví dụ .

Nhưng điều đó trông như thế nào trong hình thức bash script?

(Tôi đang dùng Mac OS X nhưng sẽ cài đặt mọi lệnh cần thiết thông qua port)


Xem các lựa chọn thay thế pgrep và pkill trên mac os x? . pgreppkilllà các lệnh đáng tin cậy để tìm hoặc tiêu diệt các tiến trình theo tên trong Solaris và Linux.
Gilles 'SO- đừng trở nên xấu xa'

Câu trả lời:


26

Chạy pgrep -f "ssh.*-D"và xem nếu điều đó trả về ID quá trình chính xác. Nếu có, chỉ cần thay đổi pgrepthành pkillvà giữ các tùy chọn và mẫu tương tự

Ngoài ra, bạn không nên sử dụng kill -9aka SIGKILL trừ khi thực sự cần thiết vì các chương trình không thể bẫy SIGKILL để tự dọn dẹp trước khi chúng thoát. Tôi chỉ sử dụng kill -9sau lần thử đầu tiên -1 -2-3.


bạn nên xác định lại tiêu diệt như một forvòng lặp kill -idành cho mỗi i;)
Seamus

1
pgrepkhông phải là bản địa trên OSX, bạn phải lấy nó từ bên thứ ba. Các chủ đề trước đây về chủ đề này có đề xuất và lựa chọn thay thế.
Gilles 'SO- ngừng trở nên xấu xa'

Người đàn ông còn sống, tôi càng sử dụng 'nix, tôi càng yêu nó :) cảm ơn vì điều này!
javamonkey79

pgrep và pkill có sẵn trong OS X 10.8 (Mountain Lion) trở lên. apple.blogoverflow.com/2012/07/ từ
Peter Hanley

Có thể hữu ích khi thêm -acờ pgreplàm cho nó in không chỉ id quá trình mà còn cả lệnh (bao gồm cả đối số). Bằng cách này, rất dễ dàng để xác minh rằng chỉ có các quy trình mong muốn được khớp.
luator


0

Bạn có thể tận dụng hệ thống tập tin Proc để thu thập thông tin. Ví dụ:

for proc in $(grep -irl "ssh.*-D" /proc/*/cmdline | grep -v "self"); do if [ -f $proc ]; then cat $proc && echo ""; fi; done

Nó không hoàn hảo, bạn sẽ muốn một regex độc quyền hơn (đặc biệt là nếu bạn đang giết các tiến trình) nhưng echo $proc | awk -F'/' '{ print $3 }'sẽ hiển thị cho bạn PID của quá trình.


1
OSX không có /proc. Và đã có một công cụ mạnh mẽ để thực hiện điều này ngoài đó, được gọi là pgrep(có sẵn ít nhất là trên Solaris và Linux).
Gilles 'SO- ngừng trở nên xấu xa'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.