무한 루프가 포함된 것으로 의심되는 프로그램이나 실행하는 데 너무 오래 걸릴 수 있는 다른 코드를 실행하고 있다고 가정해 보겠습니다. 나는 Linux에서 다음과 같은 작업을 수행할 수 있다는 것을 알고 있습니다.
timeout 1 ./program
프로그램에 1초의 시간 초과를 제공합니다. 그러나 내가 올바르게 이해했다면 이는 프로그램에 "SIGTERM" 신호만 보내는 것입니다. 프로그램은 이를 무시할 수 있습니다. 어쨌든, 프로그램이 1초 후에 중지되도록 하는 더 안전한 방법이 있습니까?
내가 생각한 한 가지 해결책은 다음과 같이 bash 및 timeout bash에서 프로그램을 실행하는 것입니다.
timeout 1 bash -c './program'
그런 다음 1초 후에 bash가 종료되므로 실행 중이던 프로그램도 종료됩니다. 이것이 좋은 해결책입니까?
답변1
그것은 실제로 "안전하다"는 것이 무엇을 의미하는지에 달려 있습니다. 프로세스를 종료하는 데는 두 가지 옵션이 있습니다.
- 정중하게 프로세스 자체 종료를 요청합니다(예: SIGTERM 사용).
- 커널에 강제로 종료하도록 무의식적으로 요청합니다(예:
kill -9
).
대부분의 경우 프로세스를 종료하는 가장 깨끗하고 "가장 안전한" 방법은 SIGTERM을 사용하여 정중하게 요청하는 것입니다. 이는 기본적으로 프로그램이 SIGTERM을 모든 하위 프로세스에 전파하여 전체 프로세스 트리를 정리하기 때문입니다. 프로세스를 종료하면 수행 중이던 작업(버퍼 플러시 등)을 완전히 종료할 시간이 있기 때문에 더 좋습니다.
프로세스를 강제 종료할 때 자식 프로세스가 반드시(또는 기본적으로) 종료되는 것은 아닙니다. 고아를 남겨두는 경향이 있습니다. 또한 파일이 손상되기 쉬우며 일반적으로 혼란을 야기합니다. 따라서 kill -9
정리를 위해 forcekill()을 자동으로 사용해서는 안 됩니다.
Bash 스크립트는 정리하기가 특히 까다롭습니다. 기본적으로 SIGTERM을 하위 프로세스에 전파하고 하위 프로세스가 종료될 때까지 기다립니다. 어떤 이유로 SIGTERM을 bash 스크립트에 보냈는데 종료되지 않으면 kill -9
고아가 거의 확실히 뒤쳐질 것입니다.
강제로 죽이려면 강제로 죽이는 스크립트가 필요합니다그리고아이들을 모두 강제로 죽여라. 이는 종종 혼란스럽기 때문에 자동 작업으로 권장되지 않습니다.
다행히도 timeout
하위 프로세스의 문제를 알고 있습니다.요청 시 전체 프로세스 트리를 지웁니다.
timeout -s 9 20 myscript
모든 하위 프로세스를 강제로 종료합니다. 이는 여전히 명령을 닫는 "더러운" 방법입니다. 왜냐하면 명령은 자체적으로 제대로 정리할 기회가 없고 파일을 손상시킬 수 있기 때문입니다.
답변2
-s
이 명령에 대한 옵션을 사용하면 timeout
시간 초과 시 전송될 신호를 지정할 수 있습니다.