큰 실행 파일에 대한 셸 래퍼가 있습니다. 이는 다음과 같은 작업을 수행합니다.
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)
프로세스를 다시 시작할 수 있습니다.