기술 · 실용 가이드
systemd status=203/EXEC? 권한을 바꾸기 전에 실패한 execve 경로를 감사하세요
203/EXEC는 서비스 관리자가 설정된 프로세스를 실행하지 못했다는 뜻입니다. 정확한 저널 이유로 대상·인터프리터 누락, 형식 오류, 경로·마운트 거부, MAC 정책을 나눠야 합니다.

systemd 유닛이 code=exited, status=203/EXEC로 끝났다면 보통 애플리케이션 로직에 도달하지 못했습니다. systemd는 203을 EXIT_EXEC, 즉 execve 시스템 호출 실패로 정의합니다. 범위는 좁아지지만 어떤 경로, 인터프리터, 마운트 규칙 또는 보안 판단이 원인인지는 아직 모릅니다.
chmod 777, 셸 래퍼, SELinux 비활성화부터 하지 마십시오. 실제 로드된 유닛과 첫 “Failed at step EXEC” 줄을 보존한 다음 서비스가 통과해야 하는 실행 경계를 감사합니다.
1. 실제 실패 명령을 보존합니다
systemctl cat UNIT과 systemctl show -p ExecStart -p User -p Group -p RootDirectory -p RootImage UNIT을 실행하고 첫 EXEC 실패 줄의 경로와 이유를 보존합니다. 유닛 정의를 바꾼 경우에만 daemon-reload를 사용합니다.
ExecStart를 대화형 셸이 아니라 systemd 문법으로 읽으십시오. 파이프, 리디렉션, 확장이 실제 설계에 필요할 때만 명시적 셸을 씁니다. systemd #23235는 실행 파일 위치의 ${APP}가 203/EXEC를 내는 재현입니다.
2. 저널 이유를 execve 분기로 연결합니다
“No such file or directory”면 readlink -f와 stat으로 대상을, head -n1 또는 readelf -l로 인터프리터를 확인합니다. execve 문서는 ENOENT가 스크립트·ELF 인터프리터 누락도 포함한다고 하며, CRLF는 shebang에 숨은 캐리지 리턴을 넣을 수 있습니다.
“Permission denied”면 namei -l로 모든 상위 경로를, findmnt -T PATH -o TARGET,FSTYPE,OPTIONS로 noexec를 봅니다. “Exec format error”는 file과 readelf -h로 형식·아키텍처를 확인합니다. 이 명령은 증거 수집이지 권한·레이블·마운트 변경 승인이 아닙니다.
3. 셸이 아니라 서비스 컨텍스트를 확인합니다
유효 User와 Group을 확인하고 그 신원으로 무해한 경로 검사만 합니다. RootDirectory나 RootImage가 있으면 실행 파일과 보조 파일이 새 루트 안에 있어야 합니다. 보호 파일시스템 설정도 서비스가 보는 경로를 바꿀 수 있습니다.
EACCES인데 일반 권한이 맞으면 배포판 지원 감사 도구로 최근 정책 기록을 확인합니다. Red Hat은 init_t가 default_t, user_home_t, nfs_t, cifs_t를 실행하다 AVC 거부와 203/EXEC를 만나는 사례를 공개합니다. AVC는 정밀 레이블·정책 수정 근거이지 강제 모드 전체를 끌 이유가 아닙니다.
4. 입증된 원인만 고칩니다
경로, 인터프리터, 줄바꿈, 실행 비트, 상위 탐색 권한, 마운트, 아키텍처, 네임스페이스, 정책 레이블은 해당 분기가 입증된 뒤에만 고칩니다. chmod 777은 누락 인터프리터, 잘못된 아키텍처, noexec, 정책 전환을 고치지 못합니다.
ExecStart는 직접 절대 경로를 우선합니다. /bin/bash 추가는 shebang 결함을 숨기고 execve가 시작하는 파일을 바꿉니다. 셸이 정말 필요하면 만능 수리가 아니라 명시적 설계로 인용합니다.
5. 실행 경계를 넘었음을 입증합니다
최소 수정 뒤 유닛 정의가 바뀐 경우에만 daemon-reload를 하고 한 번 시작해 새 로그를 읽습니다. 203/EXEC가 사라지면 실행 경계는 넘었지만 앱은 자체 상태로 실패할 수 있으므로 ActiveState, SubState, ExecMainCode, ExecMainStatus도 봅니다.
원래 이유, 단 하나의 변경, 변경 후 상태를 기록합니다. 203이 남으면 새 첫 EXEC 줄로 돌아가고 변경을 쌓지 않습니다. 패키지 서비스 경로나 정책, 출처 불명 바이너리, 보안 경계를 약화시키는 수정은 중지하고 상위 검토로 넘깁니다.
