최근 Endcrawl이라는 서비스에서 대규모 렌더링 작업을 취소하려다 우분투(Ubuntu) 리눅스 시스템 전체가 마비되는 초유의 사태가 발생했습니다. 사용자가 `sudo kill -TERM -1490947` 명령어를 실행했는데, 이는 특정 프로세스 그룹(PGID)에 종료 신호(SIGTERM)를 보내는 의도였지만, 결과적으로 `init` 프로세스를 제외한 모든 프로세스가 종료되며 서비스가 완전히 중단된 것입니다.
조사 결과, 이 사고는 우분투 24.04 LTS에 포함된 `kill` 명령어의 버그 때문으로 밝혀졌습니다. `kill` 명령은 양수 PID(프로세스 ID)를 주면 단일 프로세스를, 음수 PID를 주면 해당 프로세스 그룹 전체에 신호를 보냅니다. 문제는 `kill`이 음수 PID인 `-1490947`을 처리하는 과정에서 이를 `-1`로 잘못 해석했다는 점입니다. `kill(-1, sig)`는 호출자가 권한이 있는 모든 프로세스에 신호를 보내는 동작을 하는데, `sudo`로 실행되었기 때문에 시스템 전체 프로세스가 종료된 것입니다. 이 버그는 지난 10여 년간 우분투 14, 16, 18, 22, 24 LTS 버전에 걸쳐 네 종류의 형태로 반복적으로 나타났으며, 한 버그를 고치면 다른 버그가 생기거나 과거 버그가 재현되는 양상을 보였습니다. 근본적인 원인은 명령줄 인자를 처리하는 `getopt(3)` 라이브러리의 옵션 묶음 처리 방식과 `kill` 명령어의 인자 문법이 충돌하기 때문입니다.
이 사건은 작고 오래되었으며 널리 사용되는 핵심 도구에도 치명적인 버그가 존재할 수 있음을 보여줍니다. 특히 `kill` 명령어는 유닉스(Unix) 시스템에서 50년 가까이 사용되어 온 기본적인 도구이기에 더욱 충격적입니다. 프로세스 그룹 신호는 `Ctrl+C`를 눌러 포그라운드 프로세스 그룹을 종료하는 것처럼 흔히 사용되는 기능입니다. 이러한 핵심 도구의 버그는 개발자와 시스템 관리자에게 예측 불가능한 위험을 초래하며, 서비스 안정성에 직접적인 영향을 미칩니다. 현재 우분투 24용 수정이 진행 중이지만, 사용자들은 `kill -TERM -- -1490947`처럼 `--` 구분자를 사용하거나, `sudo -u render kill`처럼 최소 권한으로 명령을 실행하여 잠재적 위험에 대비하는 것이 권장됩니다. 이번 사례는 소프트웨어 개발에서 철저한 테스트와 견고한 설계의 중요성을 다시 한번 일깨워줍니다.