몇 가지 옵션이 있습니다. 하나는 스크립트를 중지하고 ( CtrlZ) 스크립트 의 PID를 가져 와서 SIGKILL
프로세스 그룹에 보내는 것입니다.
쉘에서 명령이 실행될 때, 명령이 시작되는 프로세스와 모든 자식은 동일한 프로세스 그룹 (이 경우 포 그라운드 프로세스 그룹)의 일부입니다. 이 그룹의 모든 프로세스에 신호를 보내려면 프로세스 리더에게 신호를 보냅니다. 를 들어 kill
명령, 프로세스 리더는 이렇게 표시된다 :
kill -PID
PID
스크립트의 프로세스 ID는 어디에 있습니까 ?
예:
test.sh
일부 프로세스를 시작 하는 스크립트 를 고려하십시오 . 쉘에서 실행했다고 가정 해보십시오.
$ ./test.sh
다른 터미널에서
$ pgrep test.sh
17802
$ pstree -ps `!!`
pstree -ps `pgrep test.sh`
init(1)───sshd(1211)───sshd(17312)───sshd(17372)───zsh(17788)───test.sh(17802)─┬─dd(17804)
├─sleep(17805)
└─yes(17803)
이 경우에 의해 생성 된 프로세스 그룹에 신호를 보내 test.sh
려면 다음을 수행하십시오.
kill -INT -17802
-INT
전송에 사용되므로이 SIGINT
명령은 CtrlC터미널 을 누르는 것과 같습니다 . 보내려면 SIGKILL
:
kill -KILL -17802
다른 터미널을 열 수없는 경우에만 스크립트를 중지하면됩니다. 가능하면 pgrep
PID를 찾는 데 사용 하십시오.
스크립트가 실행하는 명령 중 하나가 트래핑되어있을 수 있습니다 . SIGINT
이것이 CtrlC효과가없는 이유 일 수 있습니다 . 그러나 SIGKILL
갇힐 수 없으며 일반적으로 마지막 복원 옵션입니다. 죽이기 전에 SIGTERM
( -TERM
) 를 시도 할 수 있습니다 . 둘 SIGKILL
또는 SIGTERM
A와 설정 될 수 없다 키보드 바로 가기 방법이 SIGINT
있다.
스크립트에 shebang 줄이 포함되어 있지 않으면이 모든 것이 무례합니다. 에서 이 SO 답변 :
일반적으로 상위 쉘은 스크립트가 동일한 쉘에 대해 작성된 것으로 추측합니다 (최소 Bourne과 유사한 쉘은 / bin / sh를 사용하여 스크립트를 실행하고 bash는이를 bash 서브 프로세스로 실행 함) ...
이 때문에 스크립트가 실행될 때 스크립트 이름이 지정된 프로세스 (또는 명령 줄에 스크립트 이름이있는 프로세스)를 찾지 pgrep
못하고 실패합니다.
항상 세방 라인을 사용하십시오.
Ctrl + z