두 가지 시나리오가 있습니다.
#!/usr/bin/env bash
sleep infinity
# When I type Ctrl-C here, "sleep" command and script are stopped so I didn't see "End"
echo End
#!/usr/bin/env bash
docker exec container-id sleep infinity
# When I type Ctrl-C here, "docker exec" command is stopped but script continued so I saw "End"
echo End
행동의 차이는 무엇입니까?
이것이 bash
포 그라운드 프로세스가 SIGINT를 무시 하거나 처리하고 정상적으로 종료 될 때 작동 하는 방식 입니다. 아래에서 볼 수 있듯이 사용하지 않고도 재현 할 수 있습니다 docker
.
$ bash -c 'sh -c "trap true INT; sleep 10"; echo reached'
^Creached
echo
SIGINT가 여기에 도달 한 이유는 SIGINT가 잡아서 처리하기 때문입니다 sh
(그렇지 않으면 트랩 세트를 실행할 수 없습니다) bash
. 도착했을 때 포 그라운드에서 실행 중이던 프로그램을 중단하지 않았기 때문에에서 무시됩니다 .
이 동작에 대한 이론적 근거는 주어진 여기에 다음과 같이 :
기본 아이디어는 사용자가 키보드 생성 SIGINT를 포 그라운드 프로세스로 이동하려는 것입니다. 그 프로세스는 어떻게 처리할지 결정하게됩니다. bash는 그에 따라 반응합니다. 프로세스가 SIGINT로 인해 종료되면 bash는 SIGINT를받은 것처럼 작동합니다. 그렇지 않은 경우 bash는 프로세스가 처리했다고 가정하고 효과적으로 무시합니다.
정상적인 작업의 일부로 자체 목적으로 SIGINT를 사용하는 프로세스 (emacs가 일반적인 예입니다)를 고려하십시오. 스크립트에서 해당 프로그램을 실행하면 결과적으로 쉘이 스크립트를 예기치 않게 중단하는 것을 원하지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다