매일 업데이트
2023-03-06 10:43 6 min

Linux의 exec 형식 오류”

컨테이너 실행 중 "exec 사용자 프로세스 발생: exec 형식 오류" 해결하기

대규모 프로젝트를 완료한 후, 팀과 함께 환경적 문제와 개발 환경에서만 작동하는 상황을 피하고자 스테이징 및 프로덕션 단계에서 컨테이너화를 적용하기로 결정했습니다. 하지만 컨테이너 생성 과정에서 "exec 사용자 프로세스 발생: exec 형식 오류"라는 메시지를 만나게 되었고, 해결 방법을 찾기 어려울 수 있습니다. 걱정하지 마세요. 이 가이드에서는 Linux 시스템에서 이 오류의 원인을 자세히 살펴보고, 문제 해결을 위한 몇 가지 확실한 해결책을 제시합니다.

"exec 사용자 프로세스 발생: exec 형식 오류" 문제 해결 (2023년)

"exec 사용자 프로세스 발생: exec 형식 오류"의 주요 원인

가장 흔한 원인 중 하나는 #!/bin/bash와 같은 스크립트 헤더 누락입니다. 이로 인해 컨테이너를 실행하려고 할 때 CrashLoopBackOff 상태로 컨테이너가 대기 상태에 머무르게 됩니다. 컨테이너 로그를 확인하면 오류 메시지가 standard_init_linux.go:300에서 "exec 사용자 프로세스로 인해 'exec 형식 오류'가 발생했습니다."와 같이 나타나는 것을 확인할 수 있습니다.

위에 언급된 원인 외에도, 컨테이너 작업 중 이 오류를 유발하는 다른 요인들도 존재합니다:

  • 스크립트 헤더에 불필요한 공백 추가 등 잘못된 형식의 헤더 사용
  • 스크립트 작성 시 호환되지 않는 문자 인코딩 사용
  • CPU 아키텍처 불일치
  • 필요한 파일 권한 누락

이것이 이 오류의 모든 가능한 원인은 아니지만, 가장 일반적인 원인들을 나열한 것입니다. 이제 Linux 환경에서 이러한 문제를 해결하기 위한 5가지 주요 해결 방법을 살펴보겠습니다.

"exec 사용자 프로세스 발생: exec 형식 오류" 수정 방법

스크립트 언어로 작성된 코드를 실행할 때는 항상 스크립트 헤더를 사용하는 것이 좋습니다. 이는 쉘에게 어떤 인터프리터를 사용할지 알려줍니다. 스크립트 헤더는 스크립트의 진입점 역할을 한다고 생각할 수 있습니다. 스크립트 헤더 사용 시 다음 사항을 유의해야 합니다:

  • 스크립트 헤더는 #! 문자로 시작해야 합니다.
  • 헤더에는 공백이나 다른 특수 문자가 포함되어서는 안 됩니다.
  • 사용하는 프로그래밍 언어와 배포판에 맞는 헤더를 사용해야 합니다. 예를 들어 Debian 기반 배포판에서 Python 3.x를 사용한다면 다음 헤더를 사용할 수 있습니다:

#!/usr/bin/python3

Alpine Linux를 사용할 때, 많은 사용자가 다른 Linux 배포판에서 사용되는 bash 스크립트 헤더와 동일한 것을 사용하려 합니다. 하지만 Alpine Linux에서는 다음과 같은 스크립트 헤더를 사용하는 것이 더 적합합니다:

#!/bin/sh

2. 줄 바꿈 문자 인코딩 문제

줄 바꿈 문자는 사소해 보일 수 있지만, 때로는 오류의 주요 원인이 될 수 있습니다. 개행 문자(End Of Line, EOL)는 줄 바꿈을 나타내며, Windows와 Linux에서 다르게 처리됩니다. Windows는 캐리지 리턴 라인 피드(CRLF)를 사용하여 줄 바꿈을 \r\n으로 해석하는 반면, Linux는 라인 피드(LF)를 사용하여 줄 바꿈을 \n으로 해석합니다.

만약 Windows에서 CRLF 인코딩으로 작성된 파일을 Linux 환경으로 전송하게 되면, "exec 형식 오류"가 발생할 수 있습니다. 이 문제는 간단한 방법으로 해결할 수 있습니다.

  • Linux 텍스트 편집기로 해당 파일을 엽니다.
  • 찾기 및 바꾸기 기능을 사용하여 \r\n을 검색하고 모든 인스턴스를 \n으로 바꿉니다.
  • 또는, 실제 코드 작성 시 Linux 인코딩으로 설정할 수도 있습니다.

3. 아키텍처 불일치

시스템 아키텍처 불일치는 "exec 사용자 프로세스 발생: exec 형식 오류"의 또 다른 주요 원인입니다. 컨테이너 기술은 하드웨어가 아닌 소프트웨어 환경 관련 문제를 해결하기 위해 개발되었지만, 서로 다른 아키텍처에서 실행될 때 문제가 발생할 수 있습니다.

예를 들어, Apple M 시리즈 칩셋과 같은 ARM 아키텍처 시스템에서 개발된 코드를 x86 시스템을 사용하는 프로덕션 환경에 배포하려고 할 때 이 오류가 발생할 수 있습니다. 이는 ARM과 x86에서 저수준 명령어 변환 방식이 다르기 때문입니다. Docker는 Apple M1 Pro 플랫폼을 linux/arm64/v8로 인식합니다. 이 문제를 해결하려면 이미지 빌드 시 다음 Docker 구문을 사용하십시오:

docker buildx build --platform=linux/amd64 -t <이미지_이름>:<버전>-amd64 .

그런 다음, Dockerfile의 "FROM" 문을 다음 구문으로 업데이트하십시오:

FROM --platform=linux/amd64 <베이스_이미지>:<버전>

위의 명령을 사용하면 이미지가 arm64에서 amd64 아키텍처로 수정되어 문제를 해결할 수 있습니다. 이 솔루션이 Docker 배포 문제를 해결하는 데 도움이 되는지 확인하십시오.

4. 잘못된 스크립트 인코딩

잘못된 스크립트 인코딩은 일반적인 문제는 아니지만, 특히 Windows 환경에서 "exec 사용자 프로세스 발생: exec 형식 오류"를 유발할 수 있습니다. 스크립트 작성 시 인코딩이 UTF-8로 설정되어 있는지 확인하는 것이 중요합니다. VS Code를 사용하는 경우 다음 단계를 따라 인코딩을 변경할 수 있습니다:

1. 인코딩을 변경하려는 파일을 VS Code에서 엽니다.

2. 왼쪽 상단 "파일" 메뉴에서 "기본 설정"으로 이동한 다음 하위 메뉴에서 "설정"을 선택합니다. 또는 키보드에서 "Ctrl + ,"를 눌러 설정 메뉴에 직접 접근할 수 있습니다.

3. 검색 창에 "인코딩"을 입력하고 Enter 키를 누릅니다. "파일: 인코딩" 설정에서 드롭다운 메뉴를 볼 수 있습니다.

4. 드롭다운 메뉴에서 "UTF-8"을 선택합니다. 그러면 VS Code에서 열거나 수정하는 모든 파일의 인코딩 형식이 변경됩니다.

일반적으로 UTF-8 인코딩은 대부분의 사용자에게 적합합니다. 만약 여전히 오류가 발생한다면, 위와 동일한 단계를 사용하여 인코딩을 "UTF8+BOM"으로 변경해볼 수 있습니다. BOM은 Byte Order Mark의 약자입니다.

만약 vim이나 다른 명령줄 기반 텍스트 편집기를 사용한다면, 시스템 전체의 인코딩 형식을 사용해야 합니다. Linux에서 UTF-8 지원을 활성화하는 방법에 대한 자료를 참고하십시오.

5. 잘못된 파일 권한

파일 권한은 프로젝트 진행 중 종종 간과되기 쉽습니다. 권한은 읽기, 쓰기, 실행의 세 가지 유형으로 나뉘며, 실행 권한은 소유자, 사용자, 그룹의 세 가지 사용자 범주에 따라 달라집니다. 일반적으로 실행 권한 없이 실행 파일을 실행하면 "권한 거부" 오류가 발생합니다. 하지만 컨테이너화된 프로젝트에서는 실행 권한이 없는 단일 파일로 인해 "exec 사용자 프로세스 발생: exec 형식 오류"가 발생할 수도 있습니다. 컨테이너 내 모든 파일의 권한을 확인하려면 다음 단계를 따르십시오.

1. 다음 명령을 사용하여 컨테이너 디렉토리로 이동합니다.

cd <컨테이너_경로>

2. 해당 디렉토리 내 모든 파일의 권한을 확인하려면 다음 명령을 사용하십시오.

ls -la

3. 파일에 실행 권한을 추가하려면 다음 구문을 사용하십시오.

chmod +x <파일명1> <파일명2> <파일명3>

"exec 사용자 프로세스 발생: exec 형식 오류" 해결하기

더 큰 문제를 작은 조각으로 나누면 더욱 효율적으로 문제를 해결할 수 있습니다. 이 글에서는 "exec 사용자 프로세스 발생: exec 형식 오류"의 원인과 해결 방법을 알아보았습니다. 위에 제시된 해결 방법이 오류를 해결하는 데 도움이 되었으면 합니다. 파일 권한에 대한 자세한 내용은 Linux 파일 권한에 대한 자료를 참고하시기 바랍니다. 만약 오류 해결에 어려움을 겪고 있다면, 아래 댓글 섹션에 문의하십시오.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.