Có tệp PID, không có đường hầm: OpenVPN đã từng chạy chưa?
Một tệp PID còn sót lại không nói gì về việc đường hầm có hoạt động hay không. Hãy kiểm tra dịch vụ, thời điểm khởi động tiến trình và hợp đồng của trình khởi chạy trước khi xóa nó.
Khi trình khởi chạy từ chối khởi động OpenVPN vì đã có sẵn tệp PID, cách hiểu tự nhiên là có một đường hầm đang chạy ở đâu đó. Cách hiểu đó sai đủ thường xuyên để đáng kiểm tra trước khi xóa bất cứ thứ gì. Một tệp trong thư mục thời gian chạy là sổ sách, và sổ sách sống sót qua các lần sụp, khởi động lại và tắt máy bị gián đoạn mà không để lại tiến trình nào. Hai câu hỏi quyết định: có tiến trình còn sống không, và tiến trình đó có thuộc phiên bản này không.
Hãy bắt đầu từ dịch vụ, không phải từ tệp
Lời từ chối thường đến từ trình khởi chạy chứ không phải từ chính OpenVPN. Nó đọc một đường dẫn, tìm thấy thứ gì đó ở đó và dừng lại trước khi phân tích cấu hình. Vì vậy câu hỏi đầu tiên là về hợp đồng của trình khởi chạy, không phải về đường hầm.
Hãy đọc unit hoặc script đã in ra thông báo và ghi nhận ba điều: đường dẫn nó kiểm tra, loại dịch vụ nó khai báo và liệu nó có chịu trách nhiệm ghi tệp hay không. Một unit hiện đại có thể dùng giám sát đơn giản hoặc giám sát thông báo và không bao giờ chạm vào tệp PID, trong khi một script init cũ có thể tự tạo một tệp. Sao chép một kiểm tra từ mô hình này sang mô hình kia tạo ra đúng kiểu từ chối này. Tìm hiểu mô hình nào đang được dùng trước khi diễn giải bất cứ điều gì.
Chỉ khi đó câu hỏi mới trở thành liệu một phiên bản có thực sự đang chạy.
Kiểm tra xem định danh đó có thuộc phiên bản của bạn không
Một con số trong tệp chứng minh rằng một con số đã được ghi. Nó không chứng minh rằng một tiến trình với định danh đó tồn tại ngay bây giờ, và chắc chắn không chứng minh rằng tiến trình là của bạn, vì định danh được dùng lại sau khi khởi động lại.
So sánh thời điểm khởi động của tiến trình với dấu thời gian của tệp, tệp thực thi với lệnh của unit, và tư cách thành viên dịch vụ với tên của unit. Sự không khớp ở bất kỳ mục nào trong ba mục nghĩa là bạn đang xem sổ sách chứ không phải đường hầm.
Trên một máy chủ chạy container hoặc nhiều không gian tên, một định danh có thể có nghĩa trong một khung nhìn và vắng mặt trong khung nhìn khác. Không thấy một tiến trình cũng không phải bằng chứng rằng nó không tồn tại, nếu tài khoản của bạn không thể kiểm tra nó. Hãy kiểm tra từ ngữ cảnh mà trình khởi chạy dùng trước khi kết luận.
systemctl status [email protected]
ps -o pid,lstart,args -p "$(cat /run/openvpn/vpn.pid)"Trình khởi chạy đã hứa làm gì với tệp
PIDFile= cho trình quản lý dịch vụ biết đọc định danh của tiến trình chính từ đâu. Trình quản lý không ghi tệp đó, nhưng nó xóa tệp còn sót lại sau khi tắt, và chính vì thế một lần thoát bị gián đoạn có thể để lại tệp.
Sự phân chia trách nhiệm này giải thích hai triệu chứng mà người ta báo là lỗi. Một tệp không bao giờ xuất hiện nghĩa là daemon hoặc script của nó không ghi được, không phải giám sát bị cấu hình sai. Một tệp sống sót sau khi dừng nghĩa là đường tắt chưa bao giờ hoàn tất.
Điều này cũng giải thích vì sao hướng dẫn hiện hành khuyên tránh quy ước đó khi giám sát có thể theo dõi trực tiếp tiến trình chính. Hướng dẫn đó không phải là sự cho phép đổi loại của một unit đã đóng gói, vì hành vi của daemon ở tiền cảnh, khi phân nhánh hoặc khi thông báo phải khớp với điều unit khai báo. Đổi loại mà không đổi daemon và bạn sẽ có một unit báo lỗi trong khi đường hầm chạy, hoặc ngược lại. Hãy khớp cặp, hoặc để cả hai yên. Tài liệu tham chiếu dịch vụ systemd mô tả cách phân chia quyền sở hữu này.
Tắt sạch so với thoát bị gián đoạn
Một lần dừng sạch yêu cầu daemon thoát, chờ nó và để trình quản lý dọn dẹp sổ sách của chính nó. Một lần thoát bị gián đoạn, một tiến trình bị giết hoặc một lần khởi động lại giữa lúc tắt sẽ bỏ qua các phần của trình tự đó, và tệp là thứ còn lại. Tìm thấy một tệp sau sự cố cho bạn biết lần tắt chưa hoàn tất, không phải có gì đó đang lắng nghe.
So sánh dấu thời gian của tệp với lần khởi động cuối và lần dừng cuối của unit.
Sau đó kiểm tra bằng chứng sống trực tiếp. Một socket gắn với cổng VPN và một giao diện đường hầm có địa chỉ là bằng chứng rằng có gì đó đang chạy, theo cách mà một tệp văn bản trong thư mục thời gian chạy không bao giờ có. Nếu cả hai đều vắng mặt, không có gì đang chạy, bất kể tệp nói gì.
Hãy ngừng xóa tệp theo thói quen
Xóa nó là một bước phục hồi hợp lệ sau khi bạn xác định rằng không phiên bản nào sở hữu nó và trình khởi chạy ghi nhận hành vi này.
Như một thói quen thường trực trước khi khởi động, nó vô hiệu hóa chính kiểm tra mà bạn đang né tránh. Nếu tệp cũ quay lại sau mỗi lần dừng sạch, người ghi và vòng đời tắt máy không thống nhất về việc ai sở hữu đường dẫn, và sự bất đồng đó là lỗi đáng sửa.
Giữ một lối vào máy chủ độc lập, khởi động một phiên bản qua trình quản lý thông thường của nó và đọc kết quả đầu tiên. Người tiếp theo nhận được một unit hoạt động hoặc tự giải thích.