Có cách nào để lắng nghe quá trình?


9

Tôi muốn biết liệu có cách nào để nghe một quy trình trong Linux & unix hay không - khi nào kết thúc và mã thoát của quy trình (tập lệnh) là gì.

Tôi không muốn viết một kịch bản sẽ chạy Xvài giây và kiểm tra xem ps -ef | grep PIDliệu quy trình có còn tồn tại không. Tôi muốn biết liệu có một cách mà quy trình sẽ thông báo cho tôi khi nó kết thúc và mã thoát của nó là gì.

Câu trả lời:


3

Bash làm điều này cho bạn. Nó sẽ thông báo cho bạn khi quá trình kết thúc bằng cách cho bạn quyền kiểm soát lại và nó sẽ lưu trạng thái thoát trong biến đặc biệt $?. Nó trông đại khái như thế này:

someprocess
echo $?

Xem hướng dẫn sử dụng bash về các thông số đặc biệt để biết thêm thông tin.

Nhưng tôi cho rằng bạn muốn làm việc khác trong khi chờ đợi. Trong bash bạn có thể làm điều đó như thế này:

someprocess &
otherwork
wait %+
echo $?

someprocess &sẽ bắt đầu quá trình trong nền. Điều đó có nghĩa là kiểm soát sẽ trở lại ngay lập tức và bạn có thể làm công việc khác. Một quá trình bắt đầu trong nền được gọi là một công việc trong bash. waitsẽ đợi công việc đã cho kết thúc và sau đó trả về trạng thái thoát của công việc đó. Việc làm được tham chiếu bởi %n. %+đề cập đến công việc cuối cùng bắt đầu. Xem hướng dẫn bash về kiểm soát công việc để biết thêm thông tin.

Nếu bạn thực sự cần PID, bạn cũng có thể làm như thế này:

someprocess &
PID=$!
otherwork
wait $PID
echo $?

$! là một biến đặc biệt có chứa PID của quá trình nền bắt đầu cuối cùng.


Và làm thế nào để waitlàm việc? Thông thường nó sẽ lấy bao nhiêu CPU từ hệ thống?
Nir

1
Tôi không biết chính xác bash waithoạt động như thế nào . Tôi biết rằng nó không mất nhiều tài nguyên hệ thống. Bạn có thể xem lại mã nguồn tại đây: git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.def
lesmana

6

Một cách tiếp cận được thừa nhận là nặng tay - là sử dụng strace:

$ strace -e trace=none -e signal=none -p 12345

sẽ theo dõi quá trình với PID 12345, chặn không có cuộc gọi hệ thống (đầu tiên -e) và không có tín hiệu (thứ hai -e). Khi quá trình thoát ra theo cách thông thường, giá trị thoát sẽ được in.

Nếu quá trình được kết thúc bởi một tín hiệu, strace sẽ thoát âm thầm (khi chạy với các tùy chọn được đưa ra ở trên). Bạn có thể sử dụng ví dụ -e signal=killđể thay đổi hành vi này. Tuy nhiên, lưu ý rằng -e signal=all(hoặc, tương đương, bỏ qua -e signaltùy chọn) có thể tạo ra một lượng lớn đầu ra nếu tín hiệu được chương trình nhận và xử lý.


4
  1. Xâu chuỗi việc thực hiện "thông báo"

    $ process; notify $? &

    Lưu ý rằng nếu quá trình sẽ thoát theo cách không mong muốn notifysẽ không được thực thi

  2. Thiết lập bẫy

    Quá trình được báo hiệu bởi các tín hiệu có ý nghĩa khác nhau và có thể phản ứng thích hợp

    #!/bin/bash
    
    process
    
    function finish {
        notify $?
    }
    trap finish EXIT
    

Bạn không rõ bạn đang có thông báo gì trong đầu. Về bản chất, nó có thể là bất cứ thứ gì rung chuông "tất nhiên". Một cho nhiều người, ví dụ. notify-sendtừ libnotifythư viện.

$ process; notify-send "process finished with status $?" &


1

Với ptrace()bạn có thể đính kèm một bộ theo dõi vào một quy trình (hoặc chạy một cái mới), đặt một hook với PTRACE_O_TRACEEXIT(linux> = 2.5.60) và ngủ cho đến khi thoát khỏi quá trình, sau đó PTRACE_GETEVENTMSGcó trạng thái thoát.

Ở đây, một triển khai mẫu được gọi là stopper , tôi chỉ kiểm tra nó với attachtùy chọn và nó yêu cầu một vài thay đổi để làm cho nó hoạt động (cuối cùng nếu cần tôi sẽ đăng mã ở đâu đó).

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.