다른 쉘 세션에서 프로세스 종료 상태를 얻는 방법?


7

예를 들어 하나의 쉘 세션에서 명령을 실행한다고 가정하십시오 bash -c 'apt-get update && apt-get upgrade'. 5 분 후 나는 간식을 위해 밖에 나가기로 결심했고, 출구가 성공인지 실패인지에 대한 알림 메커니즘추가하는 것을 잊었다 .

글쎄, 지금은 무엇입니까? 다른 터미널에서 다른 명령 (또는 특히 PID)의 종료 상태를 쿼리 할 수 ​​있다면 결국 일종의 팝업을 표시 할 수 있습니다. 그래서 질문은 : 다른 터미널에서 이미 실행중인 프로세스의 종료 상태를 어떻게 쿼리 할 수 ​​있습니까?

다시 말해,

터미널 A에서 실행중인 프로세스를 가지고 있으며 PID가 알려져 있습니다.

터미널 B에서 명령을 실행할 때

그런 다음 터미널 A의 프로세스가 종료 상태 0 또는 종료 상태> 1로 끝나는 지 알 수 있어야합니다.


따라서 명령 B로 "감시자"를 연결 한 후 지정된 임의의 프로세스 A (지정된 PID)가 종료되면 무언가 (종료 코드를보고하는 경고 명령?)가 실행되도록 하시겠습니까? A가 나중에 B를 입력하는 동일한 쉘에서 실행되는 백그라운드 작업이라고 가정 할 수 없습니다.
바이트 사령관

@ByteCommander 맞습니다. 포 그라운드 작업입니다.
Sergiy Kolodyazhnyy

다른 쉘의 자식에서 반환 코드를 얻는 것이 가능하지 않다고 생각합니다. wait종료 후 현재 쉘에서 백그라운드 프로세스의 코드를 얻는 데 사용할 수 있지만 다른 쉘을 쿼리 할 수있는 것을 찾을 수 없습니다. 프로세스가 여전히 실행 중인지 모니터링하고 종료되면 경고를 발생시키는 것도 간단하지만 종료 코드를 찾지 못합니다. 내가 생각할 수있는 유일한 방법은 쉘 PROMPT_COMMAND을 임시 종료 코드 또는 비슷한 접근 가능한 위치에 저장하도록 쉘을 준비해야합니다 . 그게 옵션일까요?
바이트 사령관

@ByteCommander 아니요. 터미널 A를 준비하지 않고 터미널 B에서 모든 작업을 수행하십시오. 그리고 가능합니다.
Sergiy Kolodyazhnyy

1
글쎄, 그것은 영원한 준비 (.bashrc를 한 번 편집) 일 것입니다. 답변을 찾으면 기대합니다.
바이트 사령관

답변:


8

다음 strace과 같이 사용하십시오 :

sudo strace -e trace=none -e signal=none -q -p $PID

여기서는 시스템 호출이나 신호에 관심이 없으므로 표현식을 strace사용하여 무시하고 -e상태 메시지를 표시 하지 않도록 지시합니다 -q. stracePID를 사용하여 프로세스에 연결하고 $PID정상적으로 종료 될 때까지 기다렸다가 다음과 같이 종료 상태를 출력합니다.

+++ exited with 0 +++

if모든 유형의 알림을 호출 하는 간단한 표현은 다음과 같습니다.

if sudo strace -e trace=none -e signal=none -q -p $PID |& grep -q ' 0 '; then
  echo yeah
else
  echo nope
fi

예제 실행

# in terminal 1
$ (echo $BASHPID;sleep 10;true)
8807
# in terminal 2
$ if sudo strace -e{trace,signal}=none -qp8807|&grep -q ' 0 ';then echo yeah;else echo nope;fi
yeah

# in terminal 1
$ (echo $BASHPID;sleep 10;false)
12285
# in terminal 2
$ if sudo strace -e{trace,signal}=none -qp12285|&grep -q ' 0 ';then echo yeah;else echo nope;fi
nope

대부분의 크레딧은 U & L에서이 답변으로 이동 합니다. 유용한 정보가 있으면 여기에 공감하십시오.

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