Tin tức và phân tích của tất cả các thiết bị di động

Cách khắc phục “gây ra quá trình người dùng thực thi: lỗi định dạng thực thi” trong Linux

Sau khi hoàn thành một dự án lớn, nhóm của bạn và bạn đã quyết định sử dụng container cho toàn bộ dự án trong các bước dàn dựng và sản xuất để tránh mọi vấn đề liên quan đến môi trường và vào phút cuối “nó hoạt động trên máy của tôi” các câu lệnh. Tuy nhiên, trong khi tạo vùng chứa, bạn gặp phải “quy trình người dùng thực thi gây ra: lỗi định dạng thực thi” và không biết cách khắc phục. Trong hướng dẫn này, chúng ta hãy tìm hiểu các lý do có thể gây ra sự cố “quy trình người dùng thực thi: lỗi định dạng thực thi” này, cùng với một số cách khắc phục đáng tin cậy để giải quyết vấn đề này trên hệ thống Linux của bạn.

Nguyên nhân gây ra “quy trình người dùng thực thi: lỗi định dạng thực thi”

Nguyên nhân phổ biến nhất của “quy trình người dùng thực thi gây ra: lỗi định dạng thực thi” là thiếu tiêu đề tập lệnh, chẳng hạn như #!/bin/bash. Điều này dẫn đến việc container chuyển sang giai đoạn chờ với lý do CrashLoopBackTắt khi bạn cố gắng chạy nó. Khi kiểm tra tệp nhật ký vùng chứa, bạn sẽ tìm thấy tên chính xác của lỗi như Standard_init_linux.go:300: quá trình người dùng thực thi gây ra “lỗi định dạng thực thi”.

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 vùng chứa, chẳng hạn như — sử dụng tiêu đề tập lệnh sai, sử dụng mã hóa ký tự không tương thích, kiến ​​trúc CPU sai hoặc thiếu quyền đối với tệp.

Khi viết bất kỳ tập lệnh nào bằng ngôn ngữ được thông dịch, bạn nên sử dụng tiêu đề tập lệnh. 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à điểm vào của tập lệnh. Một số điều cần lưu ý khi sử dụng tiêu đề tập lệnh:

  • Tiêu đề tập lệnh phải bắt đầu bằng công việc (#!) tính cách.
  • Tiêu đề không được chứa bất kỳ khoảng trắng hoặc bất kỳ ký tự đặc biệt nào khác.
  • Sử dụng tiêu đề thích hợp cho ngôn ngữ lập trình bạn đang làm việc và tiêu đề cũng phải tương ứng với tập lệnh 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

Khi sử dụng Alpine Linux, người dùng có xu hướng sử dụng cùng một tiêu đề tập lệnh bash được sử dụng trong các bản phân phối Linux khác. Đối với Alpine Linux, nhiều người sử dụng tiêu đề tập lệnh sau:

#!/bin/ash

2. Mã hóa ký tự sai cho dòng mới

Ký tự dòng mới 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 đến là nguyên nhân chính gây ra một số lỗi. Ký tự dòng mới được sử dụng để biểu thị “Kết thúc dòng” (EOL). Điều này được giải thích khác nhau bởi Windows và Linux. Windows sử dụng CRLF (Nguồn cấp dữ liệu dòng trả về vận chuyển), 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 tin trong Windows bằng cách sử dụng mã hóa CRLF, khi được gửi đến dàn dựng hoặc sản xuất với Linux làm môi trường sẽ gây ra lỗi định dạng thực thi. Vấn đề này có thể được giải quyết bằng một số bước thực sự đơn giản:

1. Mở tệp trong trình soạn thảo văn bản Linux mà bạn chọn.

2. Sử dụng chức năng tìm và thay thế hoặc nhấn Ctrl+F để tìm kiếm “\r\n.” Khi tìm thấy, hãy thay thế nó bằng “\n” ở mọi nơi.

3. Bạn cũng có thể đặt nó thành mã hóa Linux trong khi viết mã.

3. Kiến trúc không phù hợp

Kiến trúc hệ thống không phù hợp cũng là một trong những lý do phổ biến nhất dẫn đến “quá trình người dùng exec gây ra: lỗi định dạng exec“. 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 vấn đề 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 hệ thống có kiến ​​trúc ARM, như với phiên bản mới Apple Chipset dòng M. Khi bạn đẩy mã vào môi trường sản xuất đang sử dụng hệ thống x86, điều đó sẽ dẫn đến “quy trình người dùng thực thi gây ra: lỗi định dạng thực thi”. Điều này là do mỗi đoạn mã khi được chuyển đổi sang mức hướng dẫn thấp hơn đều khác nhau đối với cả ARM và x86. Docker phát hiện Apple Nền tảng M1 Pro là “linux/arm64/v8“. Để giải quyết vấn đề này, hãy sử dụng cú pháp docker sau khi xây dựng hình ảnh:

docker buildx build --platform=linux/amd64 -t <image_name>:<version>-amd64

Sau đó cập nhật câu lệnh “TỪ” của tệp Docker của bạn bằng cú pháp sau:

FROM --platform=linux/amd64 <base_image>:<version>

Khi bạn thực hiện các câu lệnh trên, hình ảnh của bạn sẽ được sửa đổi từ kiến ​​trúc arm64 sang amd64, khắc phục sự cố hiện tại.

4. Mã hóa tập lệnh sai

Mã hóa tập lệnh sai không phải là một vấn đề phổ biến nhưng còn được biết là nguyên nhân gây ra “lỗi định dạng exec do người dùng thực thi”, đặc biệt là trong Windows PC. Khi bạn bắt đầu viết tập lệnh, 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 tập lệnh, bạn có thể thay đổi cách mã hóa bằng các bước sau:

1. Mở tệp bạn muốn thay đổi mã hóa trong Mã VS.

2. Đi tới menu “Tệp” ở trên cùng bên trái và di con trỏ lên trên “Sở thích” tùy chọn trong menu thả xuống. Tại đây, bạn cần chọn tùy chọn “Cài đặt” từ menu phụ. Ngoài ra, bạn có thể nhấn trực tiếp “CTRL + , (dấu phẩy)” 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 “mã hóa” và nhấn Enter. Tại đây, bạn sẽ thấy “Tập tin: Mã hóa” cài đặt bằng menu thả xuống.

4. Đây, chọn UTF-8 từ trình đơn thả xuống. Đ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 Mã VS.

Nói chung, việc áp dụng UTF-8 phương pháp mã hóa hoạt động cho hầu hết người dùng. Tuy nhiên, nếu bạn vẫn gặp phải 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 UTF-8 hỗ trợ trong Linux.

5. Quyền không chính xác

Quyền của tệp thường bị bỏ qua khi làm việc trên một dự án. Quyền có ba loại – đọc, viết và thực thi. Loại cuối cùng được chia thành ba loại người dùng – chủ sở hữu, người dùng và nhóm. Nói chung, nếu bạn chạy một tệp thực thi mà không có quyền chính xác, nó sẽ báo lỗi “Quyền bị từ chối”. Tuy nhiên, trong khi chứa một dự án lớn, ngay cả một tệp không có quyền thực thi cũng có thể gây ra “lỗi định dạng exec do quá trình người dùng thực thi”. Để kiểm tra quyền cho mọi tệp trong vùng chứa, hãy làm theo các bước sau:

1. Đầu tiên, điều hướng đến vùng chứa 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 của 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>

Và vì một trong những lý do gây ra lỗi này là do thiếu quyền đối với tệp, nên bạn cần lưu ý thêm điều tương tự khi cố gắng thực thi điều gì đó liên quan đến quyền của người dùng theo cách này hay cách khác. Do đó, một bài học cơ bản về quyền truy cập tệp Linux sẽ giúp bạn tránh được các vấn đề.

Mục lục