Đoạn trích Bash để giết một quá trình cho đến khi nó chết?


8

Tôi đang cố gắng viết một kịch bản bash mạnh mẽ và trong đó tôi tạo ra một quy trình nền. Vào cuối kịch bản, tôi muốn giết nó. Tôi có nó là PID.

Tôi đã nghĩ về một cái gì đó như thế này

while [[ ps ef $PID ]] ; do
  kill $PID
  sleep 0.5
done

Bất kỳ đề nghị cho bất cứ điều gì tốt hơn? Bất kỳ vấn đề có thể với phương pháp này?


Ý bạn không phải ps -efsao?
dùng1686

1
grawity: Đó chỉ là kiểu BSD so với các tùy chọn UNIX, nhưng ef dường như phù hợp hơn với các tùy chọn UNIX. Tôi sẽ tự đi với 'ps ao pid'
Kyle Brandt

while [[ ps ef $PID ]]là một lỗi cú pháp. Tôi giả sử bạn có nghĩa là while ps ef $PID.
Dennis

Câu trả lời:


10

Vấn đề với việc liên tục giết chết một quy trình là bạn có tình trạng chạy đua với quá trình tạo mới. Điều này không có khả năng đặc biệt, nhưng có thể quy trình sẽ thoát ra và một quy trình mới bắt đầu với cùng một PID khi bạn đang ngủ.

Tại sao bạn phải liên tục giết quá trình? Nếu đó là vì quá trình sẽ thoát, nhưng có thể mất một thời gian để thoát sau khi nhận được tín hiệu, bạn có thể sử dụng wait:

 kill $PID
 wait $PID

Trong một hệ thống lý tưởng, bạn sẽ không bao giờ phải lặp lại một killvấn đề kill -9 $PID. Nếu bạn phải làm như vậy, bạn có thể muốn xem xét sửa chữa bất cứ thứ gì bạn đang chạy để bạn không phải làm. Trong khi đó, bạn có thể sẽ không đạt được điều kiện cuộc đua và bạn có thể bảo vệ chống lại nó bằng cách (nói) kiểm tra dấu thời gian của / Proc / $ PID / ngay trước khi giết quá trình. Mặc dù vậy, điều đó thật tồi tệ.


1
Điều này không hoạt động nếu PID không thuộc về một tiến trình con, tức là tập lệnh này đang cố kiểm soát việc thực thi một quy trình có nguồn gốc từ nơi khác. Tôi nhận được bash: wait: pid 32137 is not a child of this shellkhi tôi cố gắng. :(
Justin Force

9

Đối với mọi người giới thiệu bước từ kill $PID đến kill -9 $PID, tôi phải nhắc bạn về việc sử dụng kill -9 vô dụng .

Không không không. Đừng dùng kill -9.

Nó không cho quá trình một cơ hội để làm sạch:

  1. tắt kết nối ổ cắm

  2. dọn dẹp tập tin tạm thời

  3. thông báo cho con của nó rằng nó sẽ biến mất

  4. thiết lập lại các đặc điểm đầu cuối của nó

Vân vân và vân vân.

Nói chung, gửi 15, và đợi một hoặc hai giây, và nếu điều đó không hiệu quả, hãy gửi 2, và nếu điều đó không hiệu quả, hãy gửi 1. Nếu không, hãy BỎ L BIN B BINNG CÁCH vì chương trình hoạt động kém!

Đừng dùng kill -9. Đừng mang ra máy gặt đập liên hợp chỉ để dọn dẹp chậu hoa.

Bây giờ, tôi không đồng ý với "loại bỏ phần nhị phân", nhưng sự tiến triển có vẻ ít gây hại hơn chỉ là a kill -9.

Tôi cũng đồng ý với sự quan tâm về các điều kiện chủng tộc về việc tạo ra các quy trình mới với cùng một PID được đề cập ở đây .


0

Đầu tiên hãy giết bình thường, Ngủ x số giây và sau đó giết -9 nếu vẫn còn. Ngoài ra, điều này có vẻ như là một tình huống kỳ lạ mà bạn đã gặp phải, có thể muốn giải thích cho chúng tôi vấn đề lớn hơn.


Đã đồng ý. Nếu nó không phản hồi và đóng lại sau một SIGTERM (tín hiệu được gửi theo mặc định bằng kill) thì có lẽ sẽ không phản hồi với lần thứ 2, 3, 4, ...., vì vậy, hành động tiếp theo của bạn sẽ là SIGKILL (kill - 9). Tất nhiên, bạn nên đảm bảo rằng X trong "ngủ X giây" đủ dài để cho phép quá trình thực hiện thao tác xóa bàn làm việc bình thường của bạn ngay cả khi hệ thống được tải nặng - có thể mất một phần một giây bình thường nhưng hàng chục giây khi hệ thống bị đập.
David Spillett

0

Thông thường bạn muốn thử kill $PIDđầu tiên,

sau đó để nó ngủ một chút để xem nó sẽ thoát ra một cách duyên dáng.

Nếu không, sau đó thực hiện kill -9 $PIDđể mạnh mẽ thoát khỏi nó.


-1

tại sao không chỉ

kill -9 $PID


2
Bởi vì bạn muốn cho các quá trình một cơ hội để dọn dẹp và chết một cách độc đáo, đó là những gì tín hiệu TERM làm (tín hiệu mặc định). Tín hiệu KILL ("-9") không mang lại cơ hội cho cơ hội đó.
ktower

Điểm tốt, nhưng các poster ban đầu đã nói rằng anh ta chỉ muốn giết nó.
chris
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.