pid $$가 주어진 프로세스 종료를 청취하십시오.


16

내가 멍청 아를 가지고 있다고 해 mypid=$$

주어진 pid로 해당 프로세스의 종료를 청취하는 데 사용할 수있는 bash / system 명령이 있습니까?

mypid를 사용하는 프로세스가 없으면 명령이 단순히 실패해야한다고 생각합니다.


: 나는 방법 C 번호를 사용하지 않는,하지만 분명히 존재해야 msdn.microsoft.com/en-us/library/fb4aw7b8(v=vs.110).aspx
알렉산더 밀스

유닉스에서는 쉘이나 C 라이브러리 함수 에서 사용 하는 자식 프로세스 를 기다리는 것이 일반적 입니다. 비 자식 프로세스를 기다리는 표준 방법은 AFAIK가 없습니다. C # 함수가이를 수행 할 수 있는지 확실하지 않습니다 ( "관련 프로세스"가 무엇인지에 따라 다름). waitwait()
Kusalananda

폴링으로이 작업을 수행 할 수는 있지만
Alexander Mills

또한 잠재적으로 잘못된 결과를 줄 수 있습니다. PID 재사용은 이론적으로 프로세스가 기다리는 프로세스와 동일한 PID로 프로세스가 활성화 될 수 있음을 의미 할 수 있습니다. Linux (순차 PID 포함)에서는 가능성낮지 만 OpenBSD (무작위 PID 할당)와 같은 시스템에서는 문제가 될 수 있습니다.
Kusalananda

답변:


21

이 답변에서 필요한 것을 얻었습니다 : https : //.com/a/41613532/1223975

.. wait <pid> pid가 현재 프로세스의 하위 프로세스 인 경우에만 사용 합니다 .

그러나 다음은 모든 프로세스에서 작동합니다.

프로세스가 완료 될 때까지 기다리려면

리눅스 :

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

다윈 ( $pid파일을 열어야 함) :

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

시간 초과 (초)

리눅스 :

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

다윈 ( $pid파일을 열어야 함) :

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

Linux와 관련이 없으며 GNU tail의 기능입니다. 따라서 GNU / Linux와 같은 GNU tail을 사용하는 모든 시스템에서 작동하며 GNU 이외의 Linux 기반 시스템에서는 작동하지 않습니다.
Stéphane Chazelas

적어도 MacOS에서 그런 식으로 나타나는 경험적 증거를 고려할 때 tail / lsof가이 경우 폴링을 사용할 것을 두려워합니다.
Alexander Mills

반복 모드에서 lsof를 + R 둔다을, 그것은 폴링을 사용하고, 그래서 그 명령은, 젠장 초마다 반복되도록
알렉산더 밀스를

3

bash 내장을 사용할 수 있습니다 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.

시스템 호출을 사용합니다 waitpid().

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

나에게 도움이되는 멋진, 희망적으로 후드에서 폴링을 사용하지 않기를 바랍니다. 감사합니다!
Alexander Mills

1
그래 내 사용 사례에 대한하지 작업이 오류를 얻을 것이다 : bash: wait: pid 47760 is not a child of this shell... 롤 드로잉 보드에 다시
알렉산더 밀스

나는 대답, 난 그냥 그것을 들으을 게시 한
알렉산더 밀스에게

2
현재 프로세스와 관련이없는 프로세스가 아닌 하위 프로세스 만 기다립니다.
Kusalananda

1

Alexander Mills가 다시 게시 한 https://stackoverflow.com/a/41613532/1223975 솔루션 과 관련하여 Timeout in Seconds DarwinGNU가없는 UNIX 유사 OS의 해결 방법은 다음과 같습니다 tail. 이 명령은 특정 Darwin적이 지 않지만 UNIX와 같은 운영 체제의 연령에 따라 제공되는 명령 줄이 필요 이상으로 복잡하여 실패 할 수 있습니다.

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

하나 이상의 이전 UNIX에서 lsof인수 +r 1m%s가 실패합니다 (슈퍼 유저의 경우에도).

lsof: can't read kernel name list.

m%s출력 포맷 규격이다. 더 간단한 포스트 프로세서는 필요하지 않습니다. 예를 들어 다음 명령은 PID 5959에서 최대 5 초 동안 대기합니다.

lsof -p 5959 +r 1 | awk '/^=/ { if (T++ >= 5) { exit 1 } }'

이 예에서 PID 5959가 5 초가 경과하기 전에 자체 협정을 종료하는 경우 ${?}입니다 0. 5 초 후에도 ${?}반환 되지 않으면1

또한 명시한다는 점에서를 지적 가치가있을 수 있습니다 +r 1의는 1그 상황에 맞게 변경 될 수 있으므로, (초) 폴링 간격이다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.