Cách đúng để khởi động lại các dịch vụ phụ thuộc trong khi cài đặt gói là gì?


10

Tôi đang tạo một gói cấu hình và muốn dừng và khởi động lại các dịch vụ có cấu hình bị ảnh hưởng. Ngay bây giờ tôi đang sử dụng service [stop|restart]trong {pre,post}{inst,rm}cách. Tôi đọc trong một câu hỏi ở đâu đó invoke-rc.dlà cách đúng đắn , bởi vì nó tôn vinh sở thích của người dùng về một dịch vụ. Tuy nhiên, tôi không thể tìm thấy bất kỳ hướng dẫn về điều này. Có ai biết hướng dẫn như vậy? Hoặc có lời khuyên nào về cách tôi nên chọn? Gói này được sử dụng nội bộ và có thể sẽ chỉ dành cho 14.04 trong hai năm tới. Tuy nhiên, tôi muốn để lại trạng thái sạch nhất có thể cho người kế vị của tôi, vì vậy systemdtôi cũng nghĩ vậy.

Từ invoke-rc.dtrang người đàn ông :

Tất cả quyền truy cập vào tập lệnh init của tập lệnh duy trì của gói Debian nên được thực hiện thông qua invoke-rc.d .

Từ Hướng dẫn chính sách Debian, Chương 9, Mục 3.3 :

Các nhà bảo trì nên sử dụng lớp trừu tượng được cung cấp bởi các chương trình update-rc.d và invoke-rc.d để đối phó với các bản inits trong các tập lệnh của gói như postinst, prerm và postrm.

...

Các tập lệnh bảo trì gói phải sử dụng invoke-rc.d để gọi /etc/init.d/* initscripts, thay vì gọi chúng trực tiếp.

Debian đã và đang sử dụng sysv-initvà sẽ chuyển trực tiếp sang systemdvà tôi cho rằng hướng dẫn chính sách sẽ được cập nhật trong thời gian tới để tham khảo systemctl. Tuy nhiên, điều tôi không chắc chắn là đây: Tôi có nên sử dụng invoke-rc.dthay vì service? Tôi có thể nói dpkgrằng tôi quan tâm đến một số tệp (thông qua trình kích hoạt), vậy có cách nào để nói dpkgrằng tôi cũng quan tâm đến một số dịch vụ và có dpkgthể thực hiện khởi động lại / tải lại không?

Để làm rõ: Tôi không viết init script. Tôi đang cung cấp một gói với cấu hình cho các ứng dụng khác, như Puppet, NTP, v.v., vì vậy tôi dừng và khởi động lại các dịch vụ tương ứng trong các tập lệnh.

Ở đây , ví dụ, là một vấn đề Docker về invoke-rc.dvs service. Vấn đề vẫn còn bỏ ngỏ, với một người, có lẽ là một người bảo trì, nhận xét rằng họ chắc chắn quan tâm đến việc này đúng cách - rõ ràng không ai trong chúng ta chắc chắn đó là gì. (Câu hỏi của tôi là độc lập với vấn đề đó.)

Câu trả lời:


5

Tôi sẽ tiếp tục sử dụng các tập lệnh inst / post inst,

preinst - Tập lệnh này thực thi trước gói đó sẽ được giải nén khỏi tệp lưu trữ Debian (".deb"). Nhiều tập lệnh 'preinst' dừng các dịch vụ cho các gói đang được nâng cấp cho đến khi quá trình cài đặt hoặc nâng cấp của chúng được hoàn thành (sau khi thực hiện thành công tập lệnh 'postinst').

postinst - Tập lệnh này thường hoàn thành bất kỳ cấu hình bắt buộc nào của gói foo một khi foo đã được giải nén khỏi tệp lưu trữ Debian (".deb"). Thông thường, các tập lệnh 'postinst' yêu cầu người dùng nhập liệu và / hoặc cảnh báo người dùng rằng nếu anh ta chấp nhận các giá trị mặc định, anh ta nên nhớ quay lại và định cấu hình lại gói đó khi tình huống được bảo đảm. Nhiều tập lệnh 'postinst' sau đó thực thi bất kỳ lệnh nào cần thiết để bắt đầu hoặc khởi động lại dịch vụ sau khi gói mới đã được cài đặt hoặc nâng cấp.

xem - https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html

Cú pháp gọi start | stop | restart được viết dưới dạng có điều kiện, xem https://www.debian.org/doc/debian-policy/ch-opersys.html phần 9.3.3.2 Chạy initscripts

if mà invoke-rc.d> / dev / null 2> & 1; sau đó

gói invoke-rc.d

khác

/etc/init.d/package

fi

vì thế ...

if which service >/dev/null 2>&1; then
        service package <action>
elif which invoke-rc.d >/dev/null 2>&1; then
        invoke-rc.d package <action>
else
        /etc/init.d/package <action>
fi

và thêm một điều kiện khác cho systemd khi cần;)

Vì vậy, có, cách thích hợp để bắt đầu rơi trở lại tập lệnh /etc/init.d khi không có trình bao bọc nào khả dụng.


Điều đó khá nhiều câu trả lời cho hầu hết các nghi ngờ của tôi, ngoại trừ một. Các invoke-rc.dtrang man và các tài liệu chính sách Debian cho chúng ta biết sử dụng nó trong mối liên hệ với /etc/init.d/các kịch bản (có thể vì họ vẫn sử dụng sysv-init). Làm thế nào để thay đổi với Upstart hoặc systemd?
muru

Cập nhật câu hỏi của bạn hoặc gửi một liên kết đến thông tin bạn đang đọc. Tôi không thấy bất cứ điều gì trong trang người đàn ông về bao bì. Tôi cho rằng nó phụ thuộc vào dịch vụ của bạn và kịch bản init (là nó mới nổi? Systemd?) Bạn đang hỏi về askubuntu.com, và ubuntu sử dụng mới nổi, vì vậy askubuntu.com/questions/58404/how-to-start-and-stop -a-dịch vụ . Nếu gói của bạn sử dụng tập lệnh init cũ, thì nó sẽ được chuyển đổi để khởi động ngay bây giờ và systemd trong thời gian dài.
Panther

Tôi đã cập nhật câu hỏi.
muru

Không có câu trả lời dễ dàng hoặc duy nhất cho câu hỏi vì "nó phụ thuộc" Đây là một chút tình huống tạm thời vì việc chuyển tiếp ubfox và debian sẽ sử dụng cả systemd. Bạn nên sử dụng invoke-rc.d cho các dịch vụ trên Debian (hoặc Ubuntu) sử dụng sysv-init và dịch vụ ... trên Ubuntu cho các dịch vụ sử dụng mới bắt đầu. Nó được kịch bản vì vậy hãy sáng tạo nếu cầninvoke-rc.d ... || service ...
Panther

Tôi nghĩ rằng bạn đang hỏi liệu bạn có nên sử dụng các tập lệnh inst / post inst, không phải cú pháp của tập lệnh của bạn.
Panther

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.