tập lệnh init.d được viết bằng Python


10

Một câu hỏi được đưa ra trên StackOverflow hỏi về cách viết init.dcác tập lệnh bằng Python. Một bình luận chỉ ra rằng các tập lệnh này phải được lập trình bằng shell chứ không phải Python. Đang viết init.dscript bằng Python:

  1. Xấu. Xấu. Xấu. Không bao giờ làm điều này.
  2. Không phải là một thực hành được đề nghị.
  3. OK, hãy cẩn thận.
  4. Giáo điều di sản.
  5. Hoàn toàn tốt

Sẽ thật tuyệt khi biết bất kỳ kịch bản ác mộng nào, hoặc nếu quy tắc này được viết bằng máu của một số sysadmin.

Câu trả lời:


9

Tôi muốn nói # 2, nhưng rất gần với # 1 - "Xấu. Xấu. Xấu. Không bao giờ làm điều này." Tiêu chuẩn, chẳng hạn như, đối với các tập lệnh init Linux nằm trong LSB , và trong khi nó không bao giờ xuất hiện và nói rằng "đây là các tập lệnh shell bourne", một số giả định được đưa ra. Một, những dòng bắt đầu bằng # là các bình luận, sẽ hoạt động tốt. Khó khăn hơn là yêu cầu tập lệnh init thực thi các lệnh từ /lib/lsb/init-functions"trong môi trường hiện tại (xem dấu chấm lệnh tích hợp đặc biệt của shell)".

Nhưng quan trọng hơn, nếu bạn đang làm bất cứ điều gì thực sự phức tạp ở đây, thì bạn đã làm sai. Các kịch bản init nên rất đơn giản và tiện dụng. Chúng nên là kịch bản theo nghĩa cổ điển, không phải chương trình. Tốt hơn hết là hút nó lên và tạo một kịch bản shell đơn giản mà bất kỳ sysadmin nào cũng có thể dễ dàng mò mẫm trong một cái nhìn nhanh hơn là tạo ra thứ gì đó đẹp đẽ và được thiết kế trong Python.

Một lưu ý khác cần ghi nhớ là systemd, có thể hoặc không phải là Tương lai của tất cả các khởi tạo hệ thống trên Linux. Theo systemd, việc khởi tạo được thực hiện bởi các tệp cấu hình đơn giản thay vì các tập lệnh, ý tưởng là tất cả các khởi động đều phù hợp với một số mẫu thiết kế tiêu chuẩn và thực sự bạn chỉ cần chọn một tệp. Nếu chương trình của bạn sử dụng một cái gì đó phức tạp để khởi tạo, thì nó sẽ nằm ngoài chính tập lệnh init.


1
Tôi sẽ đi với câu trả lời này. Vấn đề là Python không cần thiết và không phải là tiêu chuẩn, và như vậy nó có thể tạo thêm một điểm gỡ lỗi không chắc chắn và thêm điểm thất bại. Để tham khảo câu hỏi SO ban đầu, tôi tập hợp rằng các tập lệnh như vậy có thể khởi chạy trình tiện ích, nhưng chúng không nên là trình nền thực tế.
mjhm

nếu tôi nhớ, không phải tất cả các distro đều theo LSB. xem debian.
Massimo

10

Tôi không thấy vấn đề gì với nó, nếu bạn biết, chắc chắn, trình thông dịch Python sẽ có sẵn khi tập lệnh init.d đang được chạy. Điều này, với tôi, chỉ ra rằng bạn đang xem một cái gì đó được thực hiện tương đối muộn ở cấp độ chạy nhiều người dùng (hoặc "bảng điều khiển đồ họa").

Tuy nhiên ... Điều này có nghĩa là một phiên bản cụ thể của trình thông dịch Python có thể rất quan trọng đối với trình tự khởi động của bạn và đây là một trong những điều bạn cần kiểm tra khi nâng cấp.

Tôi đoán điều này có nghĩa là tôi đang nói "3. OK, hãy cẩn thận".


4
+1. Chính xác những gì tôi đã viết. "Vấn đề" duy nhất ở đây sẽ là đảm bảo bạn tuân thủ LSB, (ví dụ: cung cấp các chức năng cần thiết) và đảm bảo trình thông dịch python bạn cần có sẵn trong thời gian chạy (và không bị hỏng.)
Sam Halicke

3
Có sẵn trong thời gian chạy có thể phức tạp nếu người dùng đã chọn có / usr trên một phân vùng riêng. Điều quan trọng là tập lệnh của bạn chạy sau / usr được gắn kết vì python thường được cài đặt trong / usr.
Zoredache

@Zoredache - Ayup. Thông thường, bạn biết rằng "đã xảy ra" khi bạn đến trễ trong chuỗi RC "nhiều người dùng".
Vatine

2

Tôi đồng ý với "3. OK, với sự cẩn thận", nhưng vì những lý do khác nhau. Kinh nghiệm của tôi về Solaris là họ đã có một bản sao hệ điều hành Perl cho một số chương trình nội bộ của họ. Kịch bản shell không gì khác hơn là shell để khiến Perl khởi động. Có phải kịch bản khởi động phải được viết bằng sh? Không, nhưng nó đã cải thiện khả năng bảo trì cho quản trị viên. Và tập lệnh init không làm gì phức tạp hơn những thứ như daemon --starthay daemon --stop. Nếu bạn đã làm điều này, thì người dùng thông thường có thể khởi động công cụ của bạn ở chế độ không được ưu tiên, nếu điều đó có ý nghĩa trong bối cảnh chương trình của bạn. Và họ sẽ không cần phải có tất cả các loại cài đặt phức tạp để giải quyết.

Các bản phân phối Linux hiện đại, ngay cả những bản vẫn đang sử dụng init.d, có một bộ lớn các hàm dựng sẵn có nghĩa là giúp dễ dàng quản lý trình nền. Các quy trình khởi động đồ họa thường xuyên tận dụng các chức năng đó để giữ cho logo đẹp lên trừ khi một trong các tập lệnh khởi động bắt đầu xuất hiện lỗi. Mã Python của bạn (hoặc bất kỳ ngôn ngữ nào khác) có thể không chơi tốt với các lược đồ đó.

Nếu bạn không quan tâm đến tính thẩm mỹ hoặc khả năng bảo trì, tập lệnh init của bạn có thể được viết theo cách bạn muốn. Tôi đã thấy rất nhiều quản trị viên, những người thậm chí không thể cắt và dán đúng cách, hoàn toàn bỏ qua các đối số dòng lệnh và họ chỉ bắt đầu trình nền. Không tắt máy, trạng thái hoặc khởi động lại. Nó chưa trưởng thành, nhưng mã của họ vẫn chạy.


1

Tôi nói giữa # 1-2. LSB hướng dẫn bạn theo cách này .. và từ một Sys-Admin (vai trò không phải là dev), công việc của req sẽ đưa ra kiến ​​thức sh / bash, KHÔNG phải mức độ (hoặc thậm chí hiểu biết nhẹ) về python, PHP hoặc perl. Đó là cho ngăn xếp LAMP, không phải cho các tập lệnh init hệ thống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.