Lắng nghe để thoát khỏi quá trình đưa ra pid $$


13

Nói rằng tôi có một cái nắp trong tay, mypid=$$

Có một số lệnh bash / system tôi có thể sử dụng để lắng nghe sự thoát ra của quá trình đó với pid đã cho không?

Nếu không có quá trình với mypid tồn tại, tôi đoán lệnh đơn giản sẽ thất bại.


Tôi không sử dụng C #, nhưng rõ ràng phải có một cách: msdn.microsoft.com/en-us/l Library / fb4aw7b8 (v = vs.110) .aspx
Alexander Mills

Trong Unix, thông thường phải chờ các tiến trình con sử dụng waittrong trình bao hoặc wait()hàm thư viện C. Không có AFAIK không có cách chờ chuẩn cho một quá trình không phải là trẻ em. Vẫn chưa rõ liệu hàm C # có thể làm điều đó hay không (nó phụ thuộc vào "quy trình liên quan" là gì).
Kusalananda

Tôi có thể làm điều này với việc bỏ phiếu nhưng điều đó thật tồi tệ
Alexander Mills

Nó cũng có khả năng cung cấp cho bạn kết quả sai. Về mặt lý thuyết, việc tái sử dụng PID có thể có nghĩa là một quy trình có thể trở nên sống động với cùng một quy trình như quy trình mà bạn đang chờ đợi. Trên Linux (với các PID tuần tự) điều này sẽ không thể xảy ra , nhưng trên các hệ thống như OpenBSD (phân bổ PID ngẫu nhiên), đó sẽ là một vấn đề.
Kusalananda

Câu trả lời:


18

Tôi đã nhận được những gì tôi cần từ câu trả lời này: /programming//a/41613532/1223975

.. bật ra sử dụng wait <pid> sẽ chỉ hoạt động nếu pid đó là một quá trình con của quy trình hiện tại .

Tuy nhiên, sau đây sẽ làm việc cho bất kỳ quá trình:

Chờ đợi cho bất kỳ quá trình để kết thúc

Linux:

tail --pid=$pid -f /dev/null

Darwin (yêu cầu $pidcó tệp mở):

lsof -p $pid +r 1 &>/dev/null

Với thời gian chờ (giây)

Linux:

timeout $timeout tail --pid=$pid -f /dev/null

Darwin (yêu cầu $pidcó tệp mở):

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)

Nó không liên quan đến Linux, nó là một tính năng của đuôi GNU. Vì vậy, nó sẽ hoạt động trên bất kỳ hệ thống nào có đuôi GNU như GNU / Linux và nó sẽ không hoạt động trên các hệ thống không dựa trên GNU Linux.
Stéphane Chazelas

Tôi sợ rằng đuôi / lsof sẽ sử dụng bỏ phiếu trong trường hợp này, ít nhất là đưa ra bằng chứng thực nghiệm mà nó xuất hiện theo cách đó trên MacOS.
Alexander Mills

lsof + r đặt nó ở chế độ lặp lại, để lệnh đó lặp lại mỗi giây để nó sử dụng bỏ phiếu, chết tiệt
Alexander Mills

3

Bạn có thể sử dụng bash dựng sẵn wait:

$ sleep 10 &
[2] 28751
$ wait 28751
[2]-  Done                    sleep 10
$ help wait
wait: wait [-n] [id ...]
    Wait for job completion and return exit status.

    Waits for each process identified by an ID, which may be a process ID or a
    job specification, and reports its termination status.  If ID is not
    given, waits for all currently active child processes, and the return
    status is zero.  If ID is a a job specification, waits for all processes
    in that job's pipeline.

    If the -n option is supplied, waits for the next job to terminate and
    returns its exit status.

    Exit Status:
    Returns the status of the last ID; fails if ID is invalid or an invalid
    option is given.

Nó sử dụng cuộc gọi hệ thống waitpid()..

$ whatis waitpid
waitpid (2)          - wait for process to change state

Rất vui khi làm việc với tôi, hy vọng không sử dụng bỏ phiếu dưới mui xe, cảm ơn!
Alexander Mills

1
yeah sẽ không hoạt động cho trường hợp sử dụng của tôi, tôi gặp lỗi này: bash: wait: pid 47760 is not a child of this shell... quay lại bảng vẽ lol
Alexander Mills

Tôi có câu trả lời, tôi vừa đăng nó lên
Alexander Mills

1
Điều này sẽ chỉ chờ các quy trình con chứ không phải cho một quy trình không liên kết với quy trình hiện tại.
Kusalananda
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.