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