기술 · 실용 가이드
systemd status=203/EXEC인가요? 실행 파일·인터프리터·서비스 컨텍스트를 먼저 증명하세요
셸에서 되는 명령도 서비스 프로세스가 시작되기 전에 실패할 수 있습니다. journal을 보존하고 실제 ExecStart, 실행 경로, shebang, 상위 디렉터리, 마운트와 정책 증거를 unit 컨텍스트에서 확인하세요.

status=203/EXEC은 systemd가 프로그램 실행 단계에 도달했지만 execve가 프로그램을 시작하지 못했다는 뜻입니다. 로그인 셸과 실행 토큰, 작업 디렉터리, 사용자, 마운트 보기, 보안 컨텍스트가 다를 수 있습니다.
chmod 777, 셸 래퍼 또는 정책 비활성화로 시작하지 마세요. 첫 journal과 병합된 unit을 저장하고 실패한 실행 파일 또는 인터프리터 경로를 분류하세요.
첫 실행 증거 보존
status와 첫 journal을 저장하고 system/--user, unit 이름, boot, 시각과 203/EXEC 줄을 기록합니다.
systemctl cat으로 unit과 drop-in, show로 ExecStart·User·Group·WorkingDirectory를 확인하고 셸 명령과 비교합니다.
실행 파일과 모든 경로 확인
실제 ExecStart의 첫 토큰을 가져와 링크, file, namei -l로 각 상위 디렉터리를 검사하고 불필요한 권한을 넓히지 않습니다.
스크립트의 첫 줄을 바이트로 읽어 shebang 절대 경로와 숨은 CR을 확인합니다. 인터프리터가 없으면 스크립트가 있어도 ENOENT가 납니다.
셸이 아닌 서비스 컨텍스트 테스트
설정 사용자와 작업 디렉터리로 재현하되 sudo -u는 부분 테스트입니다. 실제 unit은 환경, 네임스페이스, capability와 파일시스템 보기까지 바꿀 수 있습니다.
실행 파일과 인터프리터에 findmnt -T를 사용해 noexec를 확인합니다. 일반 경로가 통과하면 audit AVC와 journal을 조사합니다.
증명된 경계만 수리
잘못된 ExecStart, 누락 인터프리터, shebang, 줄 끝 또는 최소 접근을 고칩니다. noexec 위치는 승인된 실행 경로로 옮기거나 소유자와 정책을 확인합니다.
SELinux 거부는 레이블과 표준 위치를 먼저 점검하고 원인을 분석합니다. 전역 permissive나 넓은 허용 규칙을 지름길로 쓰지 않습니다.
필요한 것만 다시 읽고 한 번 관찰
unit 또는 drop-in을 바꿨을 때만 daemon-reload를 실행하고 한 번 시작한 뒤 즉시 status와 새 journal을 봅니다.
예상 main PID, 자식, 작업 디렉터리와 실제 요청 하나를 확인하고 최종 unit과 좁은 변경을 저장합니다.
