Job chạy khi đăng nhập, nhật ký cho thấy client khởi động, nhưng tunnel không bao giờ lên. Hoặc nó lên rồi biến mất vài giây sau. Cả hai trường hợp, danh sách thuộc tính có lẽ vẫn ổn. launchd đã đưa ra hai lời hứa khi nhận job: nó sẽ giám sát một tiến trình, và tiến trình đó sẽ tiếp tục chạy. VPN cần cả hai, và một tệp XML đúng không cung cấp được điều nào.

Danh sách thuộc tính hợp lệ không phải là dịch vụ đang chạy

plutil -lint kiểm tra cấu trúc. Nó không thể cho bạn biết tệp nhị phân có tồn tại không, các đối số có được phiên bản client này hỗ trợ không, hay job có khởi động trong ngữ cảnh mà thông tin đăng nhập sẵn có hay không. Đây là những câu hỏi ngữ nghĩa, và chúng giải thích phần lớn các lỗi trông giống sự cố launchd.

plutil -lint /Library/LaunchDaemons/com.example.vpn.plist
launchctl print system/com.example.vpn

Hãy đọc đầu ra của lệnh thứ hai thay vì cho rằng job đã được nạp. Nó báo trạng thái thoát cuối cùng và dịch vụ có đang chạy hay không, điều này phân biệt "chưa từng khởi động" với "đã khởi động rồi chết" trước khi bạn chạm vào hồ sơ.

Agent thừa hưởng phiên người dùng, daemon thì không

Tài liệu launchd của Apple tách agent theo từng người dùng khỏi daemon hệ thống. Agent chạy trong ngữ cảnh người dùng đã đăng nhập, cùng chùm khóa và môi trường của người đó. Daemon chạy không có phiên đó, và việc chuyển job vào thư mục hệ thống không tạo lại thông tin đăng nhập tương tác của người dùng.

Chính sự khác biệt này quyết định thiết kế. Nếu kết nối đòi hỏi một người đăng nhập hoặc phê duyệt lời nhắc MFA, cách bố trí được hỗ trợ là một job trong phiên người dùng chạy sau khi đăng nhập. Nếu nó phải hoạt động mà không có ai đăng nhập, client cần một danh tính không giám sát đã được phê duyệt với quy trình gia hạn và thu hồi riêng. Chọn nhầm hàng sẽ tạo ra job khởi động sạch sẽ rồi thất bại ngay bước xác thực đầu tiên.

Đừng che lấp sự khác biệt bằng mật khẩu trong mảng đối số hoặc bằng cách tắt kiểm tra chứng chỉ. Cả hai đều biến yêu cầu xác thực thành một bí mật thường trực trong tệp đọc được, và cách thứ hai nghĩa là tunnel xác thực mọi thứ trả lời.

Giám sát chỉ hoạt động nếu tiến trình ở lại tiền cảnh

Một client tự biến mình thành daemon trả quyền điều khiển lại cho launchd ngay lập tức, và trình giám sát sau đó nhìn một tiến trình đã kết thúc. Tunnel có thể đang lên, nhưng launchd cho rằng job thất bại, và chính sách khởi động lại của nó sẽ làm điều bạn không định.

Dùng chế độ tiền cảnh hoặc dịch vụ được client ghi trong tài liệu. Nếu sản phẩm có tính năng khởi động được hỗ trợ riêng, tính năng đó đã biết cách ở lại tiền cảnh và cách bàn giao cho ngăn xếp mạng; một job tùy chỉnh là thiết kế riêng, không phải cải tiến của nó.

Cấp cho job một nhãn duy nhất, tệp thực thi dự kiến và một mảng đối số có chủ đích. Mảng không phải dòng lệnh shell, nên ống dẫn và chuyển hướng không hoạt động ở đó, và cách xử lý dấu ngoặc khác đi. Một lệnh thành công trong terminal của quản trị viên cùng lắm chỉ là kiểm tra sơ bộ.

Thông tin đăng nhập phải hoạt động không cần lời nhắc

Vận hành không giám sát chuyển vấn đề thông tin đăng nhập đi chỗ khác thay vì loại bỏ nó. Ai đó phải sở hữu danh tính, quyết định nó sống bao lâu, và ghi lại cách thay thế. Một chứng chỉ không theo dõi hết hạn sẽ trở thành sự cố gián đoạn có ngày trên lịch.

Giữ bí mật ngoài đối số và ngoài đầu ra chuẩn của job. Nếu client hỗ trợ đọc thông tin đăng nhập từ kho được bảo vệ, hãy dùng đường đó, và kiểm tra rằng ngữ cảnh thực thi của job đến được kho. Một daemon chạy bằng root thường không đọc được mục trong chùm khóa đăng nhập, và đây là kiểu chi tiết chỉ xuất hiện trong ngữ cảnh hệ thống.

Định nghĩa sẵn sàng nghĩa là gì, rồi kiểm thử tại đó

Một lần khởi chạy thành công chứng minh tiến trình đã bắt đầu. Nó không chứng minh mạng đã lên, cổng vào đã chấp nhận danh tính, hay ứng dụng riêng tư có thể truy cập. Nếu thứ khác phụ thuộc vào tunnel, nó cần một tín hiệu sẵn sàng phản ánh kết nối, không phải thời điểm job khởi động.

Các lần thử lại nên có giới hạn và nên phân biệt mạng thiếu với thông tin đăng nhập bị từ chối. Khởi động lại mỗi lần lỗi không sửa được chứng chỉ hết hạn và tạo ra nhật ký đầy những lần thử giống nhau che khuất lần thật.

Hãy chấp nhận job trong ngữ cảnh nó thực sự sẽ chạy: không có mạng khi khởi động, đăng nhập bình thường, thức dậy từ giấc ngủ và dừng có kiểm soát. Sau đó ghi lại cùng nhau nhãn job, phiên bản client và bản sửa đổi hồ sơ, để người tiếp theo thừa hưởng một dịch vụ có thể quy trách nhiệm thay vì một tệp từng chạy được.

Bài viết liên quan