Linux에서 프로세스를 종료하고 강제로 0을 반환합니까?


16

Linux 환경에서 프로세스에 리턴 신호를 보내면서 프로세스에 종료 신호를 보내려면 어떻게해야합니까? 이것을 위해 멋진 GDB 마술을해야합니까, 아니면 내가 알지 못하는 멋진 킬 신호가 있습니까?

테스트 사례 :

cat; echo $?

killall cat

다양한 kill 신호를 시도하면 129, 137 및 143과 같은 다른 리턴 신호 만 제공됩니다. 제 목표는 스크립트가 실행되는 프로세스를 종료하지만 스크립트가 성공했다고 생각하게하는 것입니다.

답변:


20

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>

프로그램에서 (g) libc를 사용하지 않으면 (예 : 어셈블리로 작성된 프로그램) 작동하지 않습니다 No symbol table is loaded. Use the "file" command. 비록 가능성이 적습니다.
Cristian Ciupitu

루비 스크립트 작업 : -D
Mikhail

1
@CristianCiupitu 그 문제를 해결할 방법이 있습니다. 다음 시스템 호출을 시작하면 대상 프로그램이 인수로 _exit시스템 호출 을 호출하도록 관련 레지스터를 수정하십시오 0. 그것은 단순히 CPU 사이클을 반복하고 태우는 것이 아닌 모든 프로세스에서 작동합니다. 프로세스가 무한 루프에 빠지지 않으면 실행 파일에서 필요한 명령을 찾아서 명령 포인터를 가리 키더라도 동일한 방법을 사용할 수 있습니다.
kasperd

@Mikhail은 GDB가 바이너리가 glibc와 연결된 루비 인터프리터 프로세스에 연결되어 있기 때문에 "루비 스크립트"에서 작동했습니다.
Daniel

@kasperd, 그래, 그래도 그래도 더 정확한 지침이 좋을 것이다.
Cristian Ciupitu


3

확실하지 않지만 나열된 신호 중 하나가 수신되면 0으로 종료됩니다. 함수 호출 등을 포함한 다른 작업을 수행 할 수 있습니다.

#!/bin/bash 
trap 'exit 0' SIGINT SIGQUIT SIGTERM

3

이 원 라이너는 나를 위해 일했습니다.

/bin/bash -c '/usr/bin/killall -q process_name; exit 0'

나는 당신이 그 질문을 이해하지 않았다고 생각합니다. 그 명령은 요청 된 것을 달성 할 방법이 없습니다. 이것이 내가 당신의 명령을 사용하여 얻은 것입니다 : $ cat; echo $? Terminated 143.
kasperd

2
@Landon Thomas 여기에 표시된 코드 줄은 실제로 0을 반환합니다. 그러나 종료 된 process_name은 0을 반환하지 않으므로 OP가 원한 것입니다.
Daniel

2

조금 해 키지 만 ..

SIGCHLD 핸들러를 대체하여 프로세스에 랩퍼를 작성할 수 있습니다. 예를 들면 다음과 같습니다.

#!/bin/bash
set -o monitor
trap 'exit(0)' CHLD
/some/dir/yourcommand

그런 다음 스크립트를 프로세스 대신이 래퍼를 실행하도록 만들 수 있습니다.이 스크립트를 $ PATH에 넣고 이름을 바꾸면됩니다.

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