Ubuntu 24.04의 kill, 음수 프로세스 그룹 ID를 -1로 오독
Alan은 2026년 9월 24일 Endcrawl 테스트 렌더를 중단하려고 Ubuntu 24.04에서 음수 프로세스 그룹 ID를 전달했다가 모든 서비스를 중단했다고 기록했습니다. procps 4.0.4가 여러 자리 그룹 ID를 `-1`로 잘못 읽은 결과입니다. `--`로 음수 값을 대상 인수로 분리할 수 있으며, 24.04용 백포트 제안은 10월 21일 기준 보완 요청 상태였습니다.
본문
개인 블로그 alangrow.com의 Alan은 2026년 9월 24일 Endcrawl의 7K 테스트 렌더를 취소하려고 sudo kill -TERM -1490947을 실행한 뒤 서비스가 모두 중단됐다고 기록했습니다. 그는 처음에 자신의 실수나 신호 처리 코드를 의심했지만, 원인은 Ubuntu 24.04에 포함된 procps의 kill(1)이 음수 프로세스 그룹 ID를 잘못 읽은 데 있었다고 분석했습니다.
kill에서 양수 PID는 한 프로세스를 가리킵니다. 음수 PID는 그 절댓값에 해당하는 프로세스 그룹을 대상으로 합니다. 관련 프로세스를 한꺼번에 중단할 때 유용하지만, 이 입력 형식은 명령행 옵션과도 혼동될 수 있습니다. -TERM이나 -9처럼 신호를 지정하는 값도 하이픈으로 시작하기 때문입니다.
Ubuntu 24.04의 procps 4.0.4는 getopt_long으로 명령행을 읽습니다. Alan이 제시한 코드에서는 음수 숫자가 옵션 처리 중 오류로 들어오면 첫 글자를 담은 optopt를 확인합니다. -1490947에서 이 변수는 전체 그룹 ID가 아니라 첫 숫자 1만 담습니다. 코드가 '0' - '1'을 계산해 PID -1을 만든 뒤 신호를 보냈습니다. 시스템 호출에서 PID -1은 호출자가 신호를 보낼 수 있는 모든 프로세스를 대상으로 하며 PID 1은 제외합니다. 해당 명령은 sudo로 실행됐기 때문에 Alan은 렌더 프로세스 대신 시스템의 거의 모든 서비스가 중단됐다고 설명했습니다.
이 오류는 최근 한 번의 실수로 생기지 않았습니다. Alan은 procps의 명령행 처리 방식이 바뀐 뒤 Ubuntu LTS 여러 버전에서 서로 다른 버그가 이어졌다고 추적했습니다. Ubuntu 14.04의 procps 3.3.9에서는 kill -HUP -1처럼 한 자리 음수 입력이 처리되지 않았습니다. 이를 고친 Ubuntu 16.04의 procps 3.3.10은 여러 자리 그룹 ID를 잘못 읽어 -1에 신호를 보내는 오류를 만들었습니다.
Ubuntu 18.04의 procps 3.3.12는 여러 자리 값을 읽도록 코드를 바꿨지만, 한 자리 -1을 처리할 때 인수 배열의 끝을 넘어가 분할 오류를 일으켰습니다. Ubuntu 22.04의 procps 3.3.17은 그 문제를 고치는 과정에서 여러 자리 음수 입력의 다른 오류를 만들었습니다. 이 경우 코드가 읽은 문자열 kill은 숫자로 변환되며 0이 되고, PID 0은 호출자와 같은 프로세스 그룹을 대상으로 합니다. 간단한 명령을 실행하는 셸은 대개 그 명령과 별도 프로세스 그룹으로 분리되지 않으므로 셸까지 종료될 수 있습니다. Ubuntu 24.04에서는 여러 자리 음수 입력이 -1로 바뀌는 앞선 유형의 버그가 다시 나타났습니다.
Alan은 getopt의 옵션 묶음 처리와 내부 인수 위치를 나타내는 optind가 버그의 배경이라고 설명합니다. getopt는 -123을 여러 개의 짧은 옵션이 이어진 형태처럼 처리할 수 있습니다. 이 과정에서 optopt는 현재 읽는 한 글자만 가리키고 optind는 옵션 묶음 처리가 끝나기 전까지 이동하지 않을 수 있습니다. 코드를 수정하면서 이 동작을 잘못 가정하면 한 자리 입력과 여러 자리 입력 중 한쪽이 다시 깨졌습니다. Alan은 kill에서는 인수 순서에 따라 신호와 프로세스 ID를 읽는 편이 단순하다고 주장합니다.
사용자가 입력을 분명히 나누는 방법도 있습니다. kill -TERM -1490947 대신 kill -TERM -- -1490947을 쓰면 -- 뒤의 음수 값은 옵션이 아니라 프로세스 그룹 ID로 전달됩니다. Alan은 이 형식이 자신이 열거한 procps 버전에서도 올바르게 처리된다고 적었습니다. 또 렌더 프로세스를 중단할 때 sudo 대신 해당 작업에 필요한 권한만 가진 계정으로 명령을 실행하면 잘못된 신호의 범위를 줄일 수 있다고 권했습니다.
별도 Ubuntu Launchpad 버그 기록은 Ubuntu 24.04.5와 procps 2:4.0.4-4ubuntu3.3에서 음수 PID를 첫 숫자로 잘라 kill(-1, 0)을 호출하는 결과를 재현했다고 적었습니다. 이 신고에는 2026년 10월 4일 데스크톱 세션이 종료된 별도 사례도 기록돼 있습니다. Ubuntu 24.04용 수정 제안의 Launchpad 상태는 10월 21일 기준 보완 요청이었습니다.
자료: alangrow.com, Ubuntu Launchpad / 정리·해설: Trawling