파이프를 통해 정지된 모든 프로세스 종료

파이프를 통해 정지된 모든 프로세스 종료

죽이기 전에 일시 중지해야 하는 스크립트를 실행 중입니다. 처음 실행했을 때 프로세스에는 PID가 하나만 있었습니다. 나는 그것을 죽이고 다시 실행했고 PID의 수가 계속 증가했습니다. 첫째, 왜 이런 행동이 발생하는가? 각 PID를 명시적으로 언급하지 않고 정지된 프로세스를 모두 종료하려면 어떻게 해야 합니까?

./toplog.sh

정지시키다:

Ctrl-Z

보류 중인 프로세스를 나열합니다.

jobs -l

산출:

[1]  12055 Stopped                 ./toplog.sh
[2]  12752 Stopped                 ./toplog.sh
[3]- 13276 Stopped                 ./toplog.sh
[4]+ 13579 Stopped                 ./toplog.sh

죽이다:

kill 12055 12752 13276 13579

답변1

죽이기 전에 일시 중지해야 하는 스크립트를 실행 중입니다.

어, 아니. 종료하기 전에 스크립트를 일시 중지할 필요가 없습니다. 언제든지 죽일 수 있습니다.

처음 실행했을 때 프로세스에는 PID가 하나만 있었습니다. 나는 그것을 죽이고 다시 실행했고 PID의 수가 계속 증가했습니다.

그러면 실제로 죽이지는 않습니다! 실행 ./toplog.sh하고 일시 중지하면 하나의 작업만 생성됩니다. 즉, 출력에 한 줄이 생성됩니다 jobs. 스크립트 자체는 여러 프로세스를 생성할 수 있지만 jobs스크립트 자체만 나열됩니다(기술 용어는 프로세스 그룹 리더입니다). 점점 더 많은 작업이 표시된다면 취소하려고 시도했지만 성공하지 못한 이전 작업이 여전히 표시된다는 의미입니다.

당신이 이 직업들을 죽일 수 없었던 이유는 아마도 그것들이 정지되었기 때문일 것입니다. 프로세스가 일시 중지되면 신호에 반응할 수 없습니다. 일시 중지된 프로세스에 신호가 전송되면 해당 신호는 프로세스가 재개될 때만 유효합니다. 예외는 커널에 의해 직접 관리되는 신호이며 프로세스와 관련이 없습니다. 한 가지 예외는 프로세스를 즉시 깨우는 프로세스를 재개하는 신호(SIGCONT)입니다. 또 다른 예외 클래스는 묻지 않고 프로세스를 종료하는 신호입니다. 여기에는 프로세스가 해당 신호에 대한 핸들러를 설정하지 않은 경우 항상 SIGKILL 및 기타 신호(SIGINT, SIGHUP, SIGTERM, SIGQUIT...)가 포함됩니다.

작업 1을 종료 하면 kill %1셸은 작업이 종료되었음을 알려줍니다. 프로세스에 대해 SIGTERM 핸들러가 설정된 경우 kill %1프로세스가 일시 중지되어 프로세스를 종료하는 동안에는 아무런 효과가 없으므로 다시 시작해야 합니다.

kill %1; kill -CONT %1

정리할 기회를 주지 않고 프로세스를 강제 종료하려면 다음을 수행하십시오.

kill -KILL %1

(또는 kill -9 %1축약).

toplog.sh이 터미널에서 시작되었는지 여부에 관계없이 모든 프로세스를 종료하려면 를 사용할 수 있습니다 pkill toplog.sh.

답변2

런타임 시 프로세스가 어떻게 호출되었는지(이 경우 toplog.sh) 알고 있으면 스크립트의 모든 인스턴스를 종료할 수 있습니다.

ps x | grep toplog.sh | grep -v grep | cut -d" " -f1 | xargs kill -9

px모든 프로세스 목록을 제공하면 대상 프로세스에서 grep이 수행됩니다. 두 번째 grep은 grep 호출 자체가 목록에서 제거되었는지 확인합니다. 그렇지 않으면 오류가 발생합니다(실제로는 괜찮지만 보기 흉합니다).잘라내기 -d" " -f1각 줄을 공백 문자로 구분된 여러 부분으로 나눕니다. 여기서 *-f1**은 첫 번째 부분을 차지합니다.xargs kill -9명령 체인에서 이전에 던져진 모든 pid를 종료합니다.

편의를 위해 다음 줄을 종료 스크립트에 넣을 수 있습니다. 여기서 프로세스 이름은 종료 스크립트 매개변수로 대체됩니다.

#!/bin/bash
ps x | grep $1 | grep -v grep | cut -d" " -f1 | xargs kill -9

그런 다음 종료할 프로세스의 이름으로 스크립트가 호출됩니다.

./kill.sh toplog.sh

관련 정보