Linux 프로세스가 하위 프로세스로 전송된 신호를 가로챌 수 있습니까?

Linux 프로세스가 하위 프로세스로 전송된 신호를 가로챌 수 있습니까?

큰 실행 파일에 대한 셸 래퍼가 있습니다. 이는 다음과 같은 작업을 수행합니다.

run/the/real/executable "$@" &
PID=$!
# perform
# a few
# minor things
wait $PID
# perform some
# post-processing

나중에 수행하는 작업 중 하나 wait는 코어 덤프를 확인하고 프로세스 충돌을 처리하는 것입니다. 그러나 그때쯤에는 프로세스가 종료되고 일부 정보를 더 이상 사용할 수 없습니다.

쉘 스크립트가 치명적인 신호를 자식 프로세스 자체에 전달하기 전에 SIGSEGV가로 챌 수 있습니까?SIGBUS

lsof -p $PID예를 들어, 래퍼 프로세스가 종료되기 전에 열었던 파일 목록을 가져오기 위해 실행할 수 있었습니다 .

고쳐 쓰다strace: 신호를 받는 과정을 캡쳐해서 사용해보았습니다 . 불행하게도 경쟁이 있는 것 같습니다. 어린이의 신호가 보고되면 어린이는 밖으로 나가서 파일 목록을 얻을 수 있을지 strace전혀 모릅니다 ...lsof

/bin/sleep이는 쓰기 위해 열려 있는 파일을 생성하고 얻으려고 시도하는 테스트 스크립트입니다 . 때로는 /tmp/sleep-output.txt정상적으로 보고되고 때로는 목록이 비어 있는 경우도 있습니다.

ulimit -c 0
/bin/sleep 15 > /tmp/sleep-output.txt &

NPID=$!

echo "Me: $$, sleep: $NPID"

(sleep 3; kill -BUS $NPID) &

ps -ww $NPID
while read line
do
        set -x
        outputfiles=$(lsof -F an -b -w -p $NPID | sed -n '/^aw$/ {n; s,.,,; p}')
        ps -ww $NPID
        lsof -F an -b -w -p $NPID
        break
done < <(strace -qq -p $NPID -e trace=signal 2>&1)
echo $outputfiles

wait $NPID

ksh위의 테스트에서는 or ( 구문이 작동 bash하려면 )을 사용해야 합니다 .< <(...)

답변1

내가 아는 한, 수행하려는 작업을 수행할 수 있는 쉘 방식은 없으며 사용자 정의 프로그램을 통해 수행해야 합니다.

사용ptrace()디버거와 유사하게 프로세스를 모니터링합니다. 프로세스가 신호를 받으면 중지되고 감시자에게 알림이 전달됩니다(해당 호출은 wait()반환되고 WIFSTOPPED(status)true가 됩니다).

그런 다음 실행하여 lsof -p <pid>프로세스의 열린 파일을 나열한 다음 호출하여 ptrace(PTRACE_CONT, pid, NULL, 0)프로세스를 다시 시작할 수 있습니다.

관련 정보