이 페이지의 내용은 다음과 같습니다.
Bash가 대화형일 때 트랩 없이 SIGTERM을 무시하고(따라서 "kill 0"이 대화형 쉘을 종료하지 않음) SIGINT가 포착되어 처리됩니다(대기 내장이 중단될 수 있도록). Bash가 SIGINT를 받으면 모든 실행 루프를 중단합니다.
일반적으로 프로그램이 신호를 받으면 SIGINT
프로그램이 종료됩니다. 하지만 bash
신호를 받으면 종료되지 않지만 SIGINT
"실행 루프가 중단됩니다.". 그게 무슨 뜻이야?
답변1
bash
이는 현재 실행 중인 내장 함수와 루프가 중단된다는 의미입니다. SIGINT 효과를 얻으 bash
려면 Ctrl+D
답변2
결국 bash는 깨졌습니다. 쉘 프로세스가 sigint를 처리하는 방식은 이를 포착한 다음 모든 처리를 중지하고 보류 중인 모든 전경 프로세스가 종료될 때까지 기다리는 것입니다. 실제로 SIGINT가 포그라운드에서 실행되는 모든 것을 중단해서는 안 될 이유가 없습니다. 이것이 프로세스 그룹이 오래 전에 만들어진 이유입니다. 사용자가 제공하는 모든 bash "명령"은 동일한 pgroup에서 프로세스를 분기해야 하며 신호는 해당 pgroup으로 전달되어야 합니다. pgroup을 올바르게 사용한다면 분기된 모든 프로세스는 기본적으로 bash와 동일한 신호 처리를 가져야 하기 때문에 신호를 전달할 필요가 없습니다. nohup은 모든 분기된 프로세스가 ighup ==를 무시하도록 해야 합니다.
원래 Unix 쉘의 신호 처리 및 프로세스 관계에 대한 많은 세부 정보가 bash에서 누락되었습니다. 특히 쉘스크립트에 대한 SIGINT는 루프에서 벗어나는 대신 전체 쉘스크립트를 완전히 중지해야 합니다. 그러면 더 많은 처리가 시작되고 SIGINT로 인해 이전 작업이 완료되지 않았기 때문에 파일이 손상될 수 있습니다.
예, 트랩 문은 Cleaner를 종료하는 데 도움이 됩니다. 그러나 원래의 유닉스 쉘 구현에서는 전혀 필요하지 않았습니다. 주로 임시 파일 사용이나 기타 유사한 세부 사항을 정리하는 메커니즘입니다. 이제 쉘은 종료해야 할 때 종료해야 하므로 안정적이고 쉽게 중단할 수 있는 쉘 스크립트를 작성하기가 어렵습니다.