Script up chạy, thoát với mã không, và tác vụ bên trong không đến được một dịch vụ riêng hoạt động hoàn hảo từ terminal hai giây sau đó. Bản năng cho rằng đó là thời điểm, và cách sửa thông thường là một giấc ngủ, thứ che giấu cuộc đua mà không hiểu nó. Cách đọc hữu ích hơn là “up” đặt tên cho một hook, không phải một bảo đảm sẵn sàng. Nó kích hoạt khi thiết bị tunnel được cấu hình, tức là trước các tuyến đường, DNS và chắc chắn trước bất kỳ ứng dụng nào phía sau tunnel.

Bài kiểm tra trong shell thành công vì nó chạy sau khi mọi thứ đã ổn định. Hook chạy tại một thời điểm cụ thể.

up nằm ở đâu trong thứ tự khởi động

OpenVPN cấu hình thiết bị tunnel rồi chạy hook up. Việc cài đặt tuyến đường là một giai đoạn sau, và nó có hook riêng, vì vậy một tác vụ phụ thuộc tuyến đường đặt trong up có thể thấy một thiết bị không có đường đi hữu ích. Đặt công việc tuyến đường vào route-up và vấn đề thời điểm thường biến mất.

Tài liệu ghi lại thứ tự này và môi trường mà mỗi hook nhận được. Thứ tự đó là toàn bộ lời giải thích cho báo cáo kinh điển “chạy được từ shell của tôi”, và cũng là lý do cùng một script có thể đạt trên máy này và thất bại trên máy khác với giai đoạn tuyến đường chậm hơn. Không kết quả nào nói lên điều gì về chất lượng của script.

DNS và sự sẵn sàng của ứng dụng đến muộn hơn nữa. Ngay cả các tuyến đường đã cài đặt cũng không phải bằng chứng rằng điểm cuối xa đang lắng nghe, rằng một tên được phân giải, hay rằng có một phiên desktop cho tác vụ trong phạm vi người dùng.

Hook thực sự thừa hưởng điều gì

Một hook chạy dưới tài khoản và môi trường của tiến trình OpenVPN, điều này không giống shell tương tác của bạn. Nó có thể thiếu bus phiên của người dùng, môi trường desktop, hoặc thông tin xác thực chỉ được mở khóa khi đăng nhập. Hãy ghi lại tác vụ thực sự cần điều nào trong số đó.

Điều đó quan trọng với các tác vụ trông như mạng nhưng phụ thuộc vào bối cảnh người dùng: gắn một chia sẻ bằng thông tin xác thực người dùng, đặt proxy cho từng người dùng, hoặc cấu hình máy in. Một hook tunnel có đặc quyền là nơi sai cho chúng, và không lượng chờ đợi nào sửa được một phiên bị thiếu.

Khi một tác vụ thất bại trong hook, hãy ghi lại tài khoản, môi trường và thao tác đầu tiên bị lỗi. Điều đó tách thời điểm quá sớm khỏi vấn đề quyền hoặc bối cảnh, và hai thứ này có cách sửa hoàn toàn khác nhau. Đoán giữa chúng là cách một bản sửa năm phút trở thành cả một buổi chiều.

Vì sao thêm một giấc ngủ không phải là kiểm tra sẵn sàng

Một giấc ngủ trì hoãn script và dịch cửa sổ cuộc đua. Vào ngày nhanh tác vụ thành công; vào ngày chậm nó lại thất bại, và lỗi trở nên khó tái tạo hơn vì độ trễ có vẻ hoạt động. Một độ trễ chỉ hoạt động dưới tải nhẹ là sự trùng hợp, không phải bản sửa.

Nếu phụ thuộc là một tuyến đường, hãy dùng hook tương ứng với việc cài đặt tuyến đường. Nếu phụ thuộc là một dịch vụ phía sau tunnel, hãy dùng một kiểm tra có giới hạn chờ đúng điều kiện đó và thất bại rõ ràng khi nó không bao giờ đến.

Giữ cho lỗi được nêu rõ. Một hook thoát với mã không trong khi công việc thực tế đã thất bại còn tệ hơn một hook thất bại, vì trình quản lý dịch vụ ghi nhận thành công và không ai nhìn lại nữa. Một dòng log từ chính script là cách rẻ nhất để giữ điều đó trung thực.

Dọn dẹp và kết nối lại cũng xứng đáng được chăm sóc như vậy

Một script thay đổi trạng thái chia sẻ cần một đường hoàn tác tương ứng. Các tuyến đường, mục resolver và dấu tường lửa do hook thêm vào nên có tính idempotent và có thể đảo ngược, nếu không một lần kết nối lại sẽ chồng bản sao thứ hai lên bản đầu tiên.

Các lần kết nối lại cũng có thể chạy hook thường xuyên hơn một lần khởi động dịch vụ đầy đủ. Một giao diện thường trú thiết lập lại phiên có thể kích hoạt lại chu trình up và route-up, nên một script giả định một lần thực thi mỗi lần khởi động cuối cùng sẽ hành xử sai. Hãy đếm số lần thực thi trong log qua một ngày chập chờn để xem nó thực sự chạy bao lâu một lần. Sau đó làm cho script an toàn để chạy ngần ấy lần.

Hãy kiểm tra vòng đời đã thất bại, không phải một lệnh sau đó. Tái tạo lần khởi động hoặc kết nối lại, quan sát hook chạy, và xác nhận tác vụ thành công đúng thời điểm nó thực sự chạy. Một thành công từ shell tương tác sau đó là bằng chứng về sự phụ thuộc, không phải bằng chứng rằng đường khởi động hoạt động.

Đặt tên cho sự kiện mà mỗi tác vụ phụ thuộc vào, rồi gắn tác vụ với sự kiện đó. Mọi thứ khác là một độ trễ giả vờ là một kiểm tra.

Bài viết liên quan