중단된 모든 프로세스를 파이프하여 종료합니다.

중단된 모든 프로세스를 파이프하여 종료합니다.

죽이기 전에 일시 중지해야 하는 스크립트를 실행 중입니다. 처음 실행하면 프로세스에 대한 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

추신 x대상 프로세스가 파악될 모든 프로세스 목록을 제공합니다. 두 번째 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

관련 정보