PGrep trả về các bộ vi xử lý


7

Kịch bản của tôi chấp nhận một tên quy trình làm đầu vào và giết chết nó. Tôi đã thử sử dụng pgrep nhưng nó trả về hai PID, một cho quy trình đang chạy và một cho tập lệnh chấp nhận tên quy trình làm đầu vào, vì vậy bị kẹt! Tôi cũng đã thử sử dụng pgrep -fotùy chọn này nhưng điều đó cũng không giúp được gì. Bất kỳ đề nghị sẽ là hữu ích. Đây là kịch bản của tôi

#!/bin/bash
ProcessName=$1

pID= pgrep -fl $ProcessName

echo $pID

Vì vậy, khi tôi gọi tập lệnh, nó sẽ trả về hai PID:

bash-3.00$ ./dynamic_values.sh test-Process

10534 /xxx/xxo/xxx/xxe --run --propFile /application/test/test-Process_Archive.tra --innerProcess
23401 /bin/bash ./dynamic_values.sh test-Process

Tôi đã mong đợi chỉ 10534, nhưng nó cũng chọn kịch bản. Phiên bản HĐH chỉ trong trường hợp:

bash-3.00$ uname -a
Linux xxxxxx 2.6.9-67.0.1.

Tại sao viết một kịch bản cho điều này? Rất nhiều công cụ đã được viết cho các loại công việc này, bạn chỉ cần tìm đúng công việc. Dựa trên câu hỏi của bạn, tôi sẽ đề nghị bạn thử pkill. Nó sử dụng logic pgreptìm kiếm quá trình tương tự như vậy vì vậy bạn đã biết cách sử dụng nó để tìm quy trình của mình, nhưng thay vì trả lại cho bạn, nó chỉ đi trước và gửi cho họ tín hiệu tiêu diệt cho bạn. Đồng thời, nó cũng quan tâm đến các chi tiết như không tự sát.
Caleb

pkillkhi sử dụng -f(mà anh ấy đang làm) sẽ có cùng một vấn đề.
bahamat

@bahamat: Thật sao? Vì vậy, bạn có phải sử dụng -xkết hợp với -fđể đảm bảo bạn phù hợp với toàn bộ? Tôi ngạc nhiên pkillkhông có cách xây dựng để xử lý việc này.
Caleb

@Caleb Từ những gì tôi đã trải nghiệm, trên OS X và Solaris, điều đó đúng, nhưng Linux sử dụng một cách triển khai khác. Tôi đã phải nhắm mục tiêu thực sự với regrec của mình để có được những gì tôi muốn trên Linux (Tôi đang viết một kịch bản có thể giết chết các phiên bản cũ của chính nó).
bahamat

Tôi chưa bao giờ pkilltự sát trước khi giết các quá trình tôi muốn giết, vì vậy tôi luôn cho rằng việc thực hiện là tốt.
jw013

Câu trả lời:


3

Tôi đã phải giải quyết vấn đề tương tự một vài tuần trước đây. pgreppkillhỗ trợ các biểu thức chính quy mở rộng để nó trở thành một vấn đề đơn giản để có được biểu thức chính xác.

Đây là kịch bản của bạn với regrec mà tôi đã sử dụng.

#!/bin/bash
ProcessName=$1

pID= pgrep -fl "^(/.*)?${ProcessName}\s"

echo $pID

Mặc dù sử dụng pkill(như Caleb đề xuất) là tốt hơn.

pkill -fl "^(/.*)?${ProcessName}\s"

Bạn vẫn có thể cần phải điều chỉnh regrec để có kết quả mong muốn cho trường hợp sử dụng của mình và cách chương trình được thực thi.

Bây giờ, nếu có thực sự nhiều tiến trình đang chạy với tên đó họ sẽ đương nhiên bị giết. Nếu bạn muốn tránh điều đó, bạn có thể sử dụng -ođể chỉ giết quá trình khớp cũ nhất hoặc -nchỉ giết mới nhất . Nếu bạn chỉ muốn một, nhưng không phải là cũ nhất hoặc mới nhất thì có lẽ bạn không nên sử dụng p(kill|grep).


bahamat, cảm ơn bạn vì tiền boa và tôi đã có thể sử dụng regex thành công.
Greenhorn

1
#!/bin/bash

ProcessName=$1

pID=`pgrep -fl $ProcessName`

echo "$pID" | grep -v  "^$$"

Quan điểm của pgreppkilllà bạn không cần phải chuyển nó sang grep.
bahamat

1
nó phụ thuộc trong trường hợp này, chúng ta nên lọc ra quy trình hiện tại bằng cách đó
trọ

Không, bạn không hiểu. Điểm duy nhất và duy nhất pgreplà không đường ống đến grep. Nếu bạn sẽ sử dụng, grepbạn cũng có thể sử dụng ps | grep.
bahamat

Tôi sợ bạn có sự hiểu lầm ở đây. điểm chính của quá trình chuẩn bị tra cứu dựa trên tên và các thuộc tính khác
nhà lưu trữ

2
Nhiều năm trước trong Solaris khởi động mọi tập lệnh init được gọi là tương đương kill $(ps -ef | grep somedaemon | grep -v grep | awk '{print $2}'). Các nhánh bổ sung đã tăng thời gian khởi động bằng cách khởi chạy 5x số lượng quy trình cần thiết. pkillpgrepđược viết để bạn có thể gọi pkill somedaemonvà giảm đáng kể thời gian khởi động.
bahamat

0

nếu bạn loại trừ #! / bin / bash thì nó sẽ không tạo ra một quy trình khác cho tập lệnh nhưng bạn sẽ mất sự lựa chọn về cái vỏ mà nó chạy với. bash là mặc định đủ mặc dù và những người smiler sẽ có thể chạy này.

không chắc chắn nếu điều đó sẽ thoát khỏi ID tiến trình thứ hai mặc dù.

Tôi hiểu điều này chưa hoàn thành nhưng đã muộn và tôi phải làm việc vào buổi sáng nhưng việc "nên" này hoạt động như một cách khắc phục nhanh.


cảm ơn vì đã dành thời gian này vào buổi tối, thật không may, nó trả về một chuỗi rỗng cũng như pid đúng, như bash-3.00 $ ./dynamic_values.sh test-Process 10534 / opt / XXengine --run --propFile / opt /application/test/test-Process_Archive.tra --innerProcess $
Greenhorn

0

Sẽ không sử dụng

| grep -v $$

để loại trừ quá trình của bạn từ danh sách trợ giúp?


Quan điểm của pgreppkilllà bạn không cần phải chuyển nó sang grep.
bahamat
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.