Xin chào các bạn đọc, hệ điều hành Linux đã trở thành một phần quan trọng trong cuộc sống của chúng ta. Với nhiều ưu điểm như bảo mật cao, ổn định và miễn phí, Linux được sử dụng rộng rãi trong các doanh nghiệp, trường học và cả cá nhân. Tuy nhiên, như bất kỳ hệ thống nào khác, Linux cũng gặp phải các vấn đề và lỗi khi sử dụng. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về một trong những lỗi phổ biến trên hệ thống Linux là “exec format error” và cách khắc phục nó. Bạn sẽ hiểu rõ hơn về nguyên nhân gây ra lỗi này và cách giải quyết để đảm bảo hệ thống của bạn hoạt động một cách ổn định và hiệu quả. Hãy cùng tôi bắt đầu!
Điều gì gây ra “exec user process caused: exec format error”
Nguyên nhân phổ biến nhất của “exec user process caused: exec format error” là script header, chẳng hạn như #!/bin/bash
. Điều này dẫn đến container sang giai đoạn chờ với lý do CrashLoopBackOff khi bạn cố chạy nó. Khi kiểm tra container log, bạn sẽ tìm thấy tên chính xác của lỗi là standard_init_linux.go:300: exec user process caused “exec format error.”.
Ngoài lý do nêu trên, có thể có các lý do khác khiến lỗi này xảy ra khi làm việc với container:
- Sử dụng script header sai, chẳng hạn như thêm khoảng trắng ở giữa.
- Sử dụng một số ký tự mã hóa không tương thích trong khi viết script.
- Kiến trúc CPU không phù hợp
- Thiếu quyền đối với file
Đây không phải là danh sách đầy đủ các lý do có thể xảy ra lỗi này, nhưng chúng ta đã liệt kê các nguyên nhân phổ biến nhất. Dưới đây là 5 giải pháp tốt nhất để khắc phục sự cố trên hệ thống của bạn.
Cách khắc phục “exec user process caused: exec format error”
1. Thiếu script header
Khi viết bất kỳ script file nào bằng ngôn ngữ thông dịch, bạn luôn nên sử dụng script header. Nó báo cho shell sử dụng trình thông dịch nào. Bạn có thể coi tiêu đề tập lệnh là entry point cho tập lệnh. Một số điều cần lưu ý khi sử dụng script header:
- Script header phải bắt đầu bằng ký tự shebang (#!).
- Script header được chứa bất kỳ khoảng trắng nào hoặc bất kỳ ký tự đặc biệt nào khác.
- Sử dụng script header thích hợp cho ngôn ngữ lập trình bạn đang làm việc và cũng phải tương ứng với script file và bản phân phối cụ thể. Ví dụ: nếu bạn đang sử dụng python 3.x trên bản phân phối dựa trên Debian, hãy sử dụng tiêu đề tập lệnh sau:
#!/bin/python3
Trong khi sử dụng Alpine Linux, người dùng có xu hướng sử dụng các script header bash giống như được sử dụng trong các bản phân phối Linux khác. Nhiều trường hợp, người ta sử dụng script header như sau:
#!/bin/ash
2. Sai kí tự xuống dòng
Ký tự xuống dòng có vẻ tầm thường và thường bị bỏ qua khi khắc phục sự cố, nhưng nó được biết là nguyên nhân chính gây ra một số lỗi. Ký tự xuống dòng được sử dụng để biểu thị “ End Of Line ” (EOL). Điều này được giải thích khác nhau bởi Windows và Linux. Windows sử dụng CRLF (Carriage Return Line Feed), diễn giải dòng mới là \r\n
. Mặt khác, Linux sử dụng LF (Line Feed), diễn giải các dòng mới là \n
.
Giả sử bạn đã viết một tệp trong Windows bằng cách sử dụng mã hóa CRLF, khi được gửi đến môi trường staging hoặc production trong môi trường linux sẽ gây ra lỗi định dạng exec. Vấn đề này có thể được giải quyết bằng một số bước thực sự đơn giản:
- Mở file trong bất kỳ trình soạn thảo văn bản Linux nào bạn chọn.
- Sử dụng chức năng tìm và thay thế để tìm kiếm “
\r\n
” trước tiên và thay thế bằng “\n
” ở tất cả các vị trí. - Ngoài ra, bạn thậm chí có thể đặt nó thành Linux encode khi bạn đang viết code thực tế.
3. Kiến trúc không phù hợp
Kiến trúc hệ thống không khớp cũng là một trong những lý do phổ biến nhất dẫn đến lỗi “exec user process caused: exec format error “. Công nghệ container hóa được phát triển để giải quyết các vấn đề liên quan đến môi trường phần mềm chứ không phải phần cứng.
Ví dụ: điều này thường xảy ra khi bạn đang làm việc trên các dự án trên một hệ thống có kiến trúc ARM, chẳng hạn như với chipset Apple M-series mới (M1 hoặc M2 …) . Khi bạn deploy code vào hệ thống sử dụng hệ thống x86, nó sẽ dẫn đến lỗi trên. Điều này là do mọi đoạn code khi được chuyển đổi sang cấp hướng dẫn thấp hơn đều khác nhau đối với cả ARM và x86. Docker phát hiện nền tảng Apple M1 Pro là “ linux/arm64/v8“. Để giải quyết vấn đề này, hãy sử dụng cú pháp docker sau trong khi build image:
docker buildx build --platform=linux/amd64 -t <image_name>:<version>-amd64 .
Sau đó, cập nhật câu lệnh “FROM
” của tệp Docker của bạn bằng cú pháp sau:
FROM --platform=linux/amd64 <base_image>:<version>
Ví dụ, gần đây tôi có build 1 image python trên mac M2 rồi deploy lên linux, sau đó tôi gặp lỗi như sau:
exec /usr/local/bin/python3: exec format error
Sau đó để fix lỗi này tôi sửa thành thế này:
FROM --platform=linux/amd64 python:3.8-slim-buster ....
Khi bạn thực hiện các câu lệnh trên, image của bạn sẽ được sửa đổi từ kiến trúc arm64 sang amd64, khắc phục sự cố trong tầm tay. Hãy cho tôi biết nếu giải pháp này khắc phục được sự cố với việc triển khai docker của bạn.
4. Mã hóa tập lệnh sai
Mã hóa tập lệnh sai không phải là sự cố phổ biến nhưng cũng được biết là nguyên nhân gây ra lỗi, đặc biệt là trong Windows. Khi bạn bắt đầu viết script, hãy đảm bảo rằng mã hóa được đặt thành UTF-8. Nếu bạn đang sử dụng VS Code để viết script, bạn có thể thay đổi mã hóa bằng các bước sau:
1. Mở file bạn muốn thay đổi mã hóa trong VS Code.
2. Chuyển đến menu “File” ở trên cùng bên trái và di con trỏ chuột qua tùy chọn “ Preferences ” trong menu thả xuống. Tại đây, bạn cần chọn tùy chọn “Settings” từ menu phụ. Ngoài ra, bạn có thể nhấn trực tiếp “ CTRL + ,” trên bàn phím để truy cập menu Cài đặt. Thao tác này sẽ mở menu cài đặt trong một tab riêng.
3. Trong thanh tìm kiếm, nhập “encoding” và nhấn Enter. Tại đây, bạn sẽ thấy cài đặt “ Files: Encoding ” với menu thả xuống.
4. Tại đây, chọn UTF-8 . Điều này sẽ thay đổi định dạng mã hóa cho tất cả các tệp chung được mở hoặc sửa đổi bằng VS Code.
Nói chung, việc áp dụng phương pháp mã hóa UTF-8 phù hợp với hầu hết người dùng. Nhưng nếu bạn vẫn gặp lỗi, bạn có thể thử thay đổi mã hóa thành UTF8+BOM bằng các bước tương tự như đã đề cập ở trên. Ở đây, BOM là viết tắt của Byte Order Mark.
Nếu bạn đang sử dụng vim hoặc bất kỳ trình soạn thảo văn bản dựa trên dòng lệnh nào khác, nó sẽ sử dụng định dạng mã hóa toàn hệ thống. Hãy xem bài viết này về cách kích hoạt hỗ trợ UTF-8 trong Linux .
5. Permission file không chính xác
Permission đối với file thường bị bỏ qua khi làm việc trên một project. Permission có ba loại – read (đọc), write (ghi) và excute (thực thi). Loại cuối cùng được chia thành ba loại người dùng – owner, user và group. Nói chung, nếu bạn chạy một file runtime mà không có permission chính xác, nó sẽ báo lỗi “Permission denied”. Tuy nhiên, trong quá trình triển khai docker cho một dự án nào đó, ngay cả một file đơn lẻ không có permission excute cũng có thể gây ra “exec user process caused: exec format error”. Để kiểm tra permission cho mọi tệp trong container, hãy làm theo các bước sau:
1. Đầu tiên, điều hướng đến container bằng lệnh:
cd <path_to_container>
2. Sau đó, để kiểm tra quyền truy cập tệp của mọi tệp trong thư mục, hãy sử dụng lệnh sau:
ls -la
3. Để thay đổi quyền cho một tệp thành quyền thực thi, hãy sử dụng cú pháp sau:
chmod +x <file_name_1> <file_name_2> <file_name_3>
Kết thúc
Tổng kết lại, khi gặp phải lỗi “exec format error” trên hệ thống Linux của bạn, bạn có thể áp dụng một số phương pháp bên trên để giải quyết vấn đề.
Nếu bạn là một nhà phát triển hoặc quản trị viên hệ thống Linux, việc hiểu và sửa các lỗi như “exec format error” là rất quan trọng để đảm bảo hệ thống của bạn hoạt động trơn tru và ổn định. Hy vọng bài viết này sẽ giúp bạn giải quyết vấn đề và nâng cao kiến thức của mình về hệ thống Linux. Cảm ơn các bạn đã đọc và hẹn gặp lại trong các bài viết tiếp theo!