프로세스를 모니터링할 수 있는 방법이 있나요?

프로세스를 모니터링할 수 있는 방법이 있나요?

Linux 및 unix에서 프로세스를 수신할 수 있는 방법이 있는지 알고 싶습니다. 프로세스가 언제 종료되고 프로세스(스크립트)의 종료 코드가 무엇인지 알고 싶습니다.

X몇 초 동안 실행되어 ps -ef | grep PID프로세스가 아직 존재하는지 확인하는 스크립트를 작성하고 싶지 않습니다 . 프로세스가 종료된 시기와 종료 코드가 무엇인지 알려주는 방법이 있는지 궁금합니다.

답변1

한 가지 (분명히 엄격한) 방법은 다음을 사용하는 것입니다 strace.

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

-ePID 12345를 사용하는 프로세스는 시스템 호출(첫 번째 호출 )과 신호(두 번째 호출 -e) 를 차단하여 모니터링됩니다 . 프로세스가 일반적인 방법으로 종료되면 종료 값이 인쇄됩니다.

프로세스가 신호에 의해 종료되면 strace는 자동으로 종료됩니다(위에 제공된 옵션을 사용하여 실행하는 경우). 예를 들어 다음을 사용하여 -e signal=kill이 동작을 변경할 수 있습니다 . 그러나 프로그램이 신호를 수신하고 처리하는 경우 -e signal=all(또는 이 옵션을 생략하는 경우 -e signal) 많은 양의 출력이 생성될 수 있습니다.

답변2

  1. 링크 "알림" 실행

    $ process; notify $? &
    

    프로세스가 예기치 않게 종료되면 notify실행되지 않습니다 .

  2. 함정을 설치하라

    프로세스는 다양한 의미의 신호로 표시되며 적절하게 반응할 수 있습니다.

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

어떤 알림을 원하는지 알 수 없습니다. 본질적으로 그것은 "종"을 울리는 모든 것이 될 수 있습니다. 예를 들어, 여러 목적을 위한 하나입니다. 도서관 notify-send에서 .libnotify

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

답변3

Bash가 이 작업을 수행합니다. 프로세스가 끝나면 제어권을 사용자에게 돌려주고 종료 상태를 특수 변수에 저장하여 이를 알려줍니다 $?. 대략 다음과 같습니다.

someprocess
echo $?

보다특수 매개변수에 대한 bash 매뉴얼더 많은 정보를 알고 싶습니다.

하지만 기다리는 동안 다른 일을 하고 싶다고 가정하겠습니다. Bash에서는 다음과 같이 할 수 있습니다:

someprocess &
otherwork
wait %+
echo $?

someprocess &프로세스가 백그라운드에서 시작됩니다. 이는 제어권이 즉시 반환되고 다른 작업을 수행할 수 있음을 의미합니다. 백그라운드에서 시작된 프로세스를 bash에서는 작업이라고 합니다. wait지정된 작업이 완료될 때까지 기다린 다음 작업의 종료 상태를 반환합니다. 할당은 에서 참조됩니다 %n. %+마지막으로 시작된 작업을 나타냅니다. 보다작업 제어에 대한 bash 매뉴얼더 많은 정보를 알고 싶습니다.

PID가 정말로 필요한 경우 다음과 같이 할 수도 있습니다.

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

$!마지막으로 시작된 백그라운드 프로세스의 PID를 포함하는 특수 변수입니다.

답변4

ptrace()추적기를 프로세스에 연결하거나 새 프로세스를 실행하거나 설정할 수 있습니다 .with PTRACE_O_TRACEEXIT(linux >= 2.5.60) 프로세스가 종료될 때까지 대기 상태를 유지한 다음 PTRACE_GETEVENTMSG종료 상태를 가져옵니다.

다음은 다음과 같은 샘플 구현입니다.플러그, 방금 attach해당 옵션으로 확인했는데 작동하려면 몇 가지 변경이 필요합니다(결국 필요한 경우 어딘가에 코드를 게시하겠습니다).

관련 정보