Cách khắc phục lỗi 'zsh: killed' trên các dòng Mac M1, M2 và M3

intermediate🍎 macOS2026-05-28| macOS (Apple Silicon M1, M2, M3), Terminal, zsh

Error Message

zsh: killed [command_name]
#apple-silicon#codesign#security#terminal#macos

Tình huống lỗi

Bạn vừa biên dịch xong một công cụ mới hoặc tải xuống một tiện ích từ GitHub. Nhưng khi bạn cố gắng chạy nó trên máy Mac dòng M, terminal lập tức đóng tiến trình. Thay vì kết quả mong đợi, bạn nhận được một dòng thông báo khó hiểu:

zsh: killed [command_name]

Kernel (nhân hệ điều hành) đã dừng tiến trình trước khi một dòng mã nào kịp thực thi. Bạn sẽ không tìm thấy nhật ký (logs), vết ngăn xếp (stack traces) hay bất kỳ giải thích nào trong cửa sổ console. Nó đơn giản là dừng lại.

Tại sao điều này xảy ra trên Apple Silicon

Apple Silicon không chỉ tập trung vào tốc độ; nó còn về bảo mật. Các dòng Mac chạy Intel cũ thường khá thoải mái với mã nguồn chưa được ký (unsigned code). Mac ARM64 đã thay đổi cuộc chơi bằng cách thực thi một quy tắc nghiêm ngặt ở cấp độ phần cứng: mọi trang bộ nhớ thực thi đều phải có chữ ký mã hóa hợp lệ.

Cơ chế bảo mật này được quản lý bởi Apple Mobile File Integrity (AMFI). Nếu hệ thống phát hiện một file nhị phân (binary) không đáp ứng các tiêu chuẩn bảo mật, nó sẽ ngay lập tức dừng tiến trình đó. Điều này thường xảy ra do:

  • File nhị phân được biên dịch cục bộ mà không qua bước ký mã.
  • Bạn chuyển một công cụ từ máy Mac Intel (x86_64) sang máy Apple Silicon (arm64).
  • Tệp đã bị chỉnh sửa sau khi được ký.
  • Gatekeeper đã gắn cờ tệp là "quarantined" (bị cách ly) vì tệp được tải về từ trình duyệt.

Bước 1: Khắc phục nhanh - Ký mã Ad-Hoc

Bạn không cần tài khoản Apple Developer trả phí để khắc phục lỗi này. Bạn có thể áp dụng chữ ký "ad-hoc", điều này thông báo cho macOS rằng bạn tin tưởng file nhị phân này để chạy cục bộ trên máy của mình.

Chạy lệnh sau trong terminal của bạn:

codesign -s - --deep --force ./path/to/your/binary

Ý nghĩa của các tham số (flags) này:

  • -s -: Áp dụng chữ ký "null identity" (ad-hoc).
  • --deep: Ký đệ quy mọi thư viện hoặc framework lồng bên trong file nhị phân.
  • --force: Ghi đè lên bất kỳ chữ ký hiện có hoặc không hợp lệ nào có thể gây ra xung đột.

Bước 2: Loại bỏ cờ Quarantine

Nếu bạn tải công cụ qua Chrome, Safari hoặc curl, macOS sẽ đính kèm một thuộc tính metadata gọi là com.apple.quarantine. Ngay cả khi đã có chữ ký, Gatekeeper vẫn có thể chặn việc thực thi.

Đầu tiên, hãy kiểm tra xem thuộc tính này có tồn tại không:

xattr ./path/to/your/binary

Nếu com.apple.quarantine xuất hiện trong danh sách, hãy loại bỏ nó bằng lệnh này:

xattr -d com.apple.quarantine ./path/to/your/binary

Bước 3: Các quyền nâng cao (Cho Debuggers & JIT)

Các ứng dụng phức tạp—như trình gỡ lỗi tùy chỉnh hoặc các công cụ sử dụng biên dịch Just-In-Time (JIT)—yêu cầu các quyền cụ thể để tương tác với bộ nhớ hệ thống. Nếu chữ ký cơ bản không hiệu quả, bạn có thể cần một tệp entitlements.

  • Tạo một tệp có tên entitlements.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
</dict>
</plist>
  • Ký file nhị phân bằng plist này:
codesign -s - --deep --force --entitlements entitlements.plist ./path/to/your/binary

Xác minh: Xác nhận việc sửa lỗi

Để đảm bảo hệ thống hiện đã chấp nhận file nhị phân của bạn, hãy sử dụng công cụ codesign để kiểm tra:

codesign -vvv ./path/to/your/binary

Tìm dòng valid on disksatisfies its Designated Requirement trong kết quả trả về. Nếu bạn thấy chúng, chương trình của bạn giờ đây sẽ khởi chạy mà không còn gặp phải lỗi zsh: killed.

Tóm tắt các lệnh

Nếu bạn muốn nó hoạt động ngay lập tức, hãy chạy lần lượt hai lệnh sau:

# Xóa các hạn chế tải xuống
xattr -cr ./path/to/your/binary

# Áp dụng chữ ký cục bộ
codesign -s - --deep --force ./path/to/your/binary

Related Error Notes