Linux 환경에서 프로세스에 리턴 신호를 보내면서 프로세스에 종료 신호를 보내려면 어떻게해야합니까? 이것을 위해 멋진 GDB 마술을해야합니까, 아니면 내가 알지 못하는 멋진 킬 신호가 있습니까?
테스트 사례 :
cat; echo $?
killall cat
다양한 kill 신호를 시도하면 129, 137 및 143과 같은 다른 리턴 신호 만 제공됩니다. 제 목표는 스크립트가 실행되는 프로세스를 종료하지만 스크립트가 성공했다고 생각하게하는 것입니다.
답변
GDB 및 프로세스 ID를 사용하여 프로세스에 첨부 한 다음 인수로 call
명령 을 발행 할 수 exit(0)
있습니다.
call
실행중인 프로그램 내에서 함수를 호출 할 수 있습니다. 호출 exit(0)
은 리턴 코드 0으로 종료됩니다.
gdb -p <process name>
....
.... Gdb output clipped
(gdb) call exit(0)
Program exited normally.
한 줄 도구로 :
gdb --batch --eval-command 'call exit(0)' --pid <process id>
답변
쉘이이를 잡을 SIGCHLD
때 무조건 리턴 값을 0이 아닌 값으로 적절하게 설정하므로 스크립트 나 쉘을 수정해야합니다.
답변
확실하지 않지만 나열된 신호 중 하나가 수신되면 0으로 종료됩니다. 함수 호출 등을 포함한 다른 작업을 수행 할 수 있습니다.
#!/bin/bash
trap 'exit 0' SIGINT SIGQUIT SIGTERM
답변
이 원 라이너는 나를 위해 일했습니다.
/bin/bash -c '/usr/bin/killall -q process_name; exit 0'
답변
조금 해 키지 만 ..
SIGCHLD 핸들러를 대체하여 프로세스에 랩퍼를 작성할 수 있습니다. 예를 들면 다음과 같습니다.
#!/bin/bash
set -o monitor
trap 'exit(0)' CHLD
/some/dir/yourcommand
그런 다음 스크립트를 프로세스 대신이 래퍼를 실행하도록 만들 수 있습니다.이 스크립트를 $ PATH에 넣고 이름을 바꾸면됩니다.