วิธีที่ถูกต้องในการเริ่มบริการที่ขึ้นต่อกันในขณะติดตั้งแพ็คเกจคืออะไร?


10

ฉันกำลังสร้างแพ็คเกจการกำหนดค่าและต้องการหยุดและเริ่มบริการที่มีผลต่อการกำหนดค่า ตอนนี้ผมใช้service [stop|restart]ใน{pre,post}{inst,rm}ทาง ฉันอ่านคำถามในที่ที่invoke-rc.dถูกต้องเพราะได้รับความพึงพอใจจากผู้ใช้เกี่ยวกับบริการ อย่างไรก็ตามฉันไม่พบแนวทางเกี่ยวกับเรื่องนี้ ไม่มีใครรู้แนวทางดังกล่าวหรือไม่ หรือมีคำแนะนำใด ๆ เกี่ยวกับวิธีที่ฉันควรเลือก แพ็คเกจนี้ใช้ภายในและมีแนวโน้มว่าจะอยู่ที่ 14.04 ในอีกสองปีข้างหน้า อย่างไรก็ตามฉันต้องการปล่อยให้สถานะที่สะอาดที่สุดเท่าที่จะเป็นไปได้สำหรับผู้สืบทอดsystemdของฉัน

จากinvoke-rc.dหน้าคน :

เข้าถึงทุกสคริปต์ init โดยแพคเกจเดเบียนสคริปต์ดูแลควรจะทำผ่านวิงวอน-rc.d

จากคู่มือนโยบาย Debian, บทที่ 9, ส่วน 3.3 :

ผู้ดูแลควรใช้เลเยอร์ abstraction ที่จัดทำโดยโปรแกรม update-rc.d และ invoke-rc.d เพื่อจัดการกับ initscripts ในสคริปต์ของแพ็คเกจเช่น postinst, prerm และ postrm

...

สคริปต์ผู้ดูแลแพ็คเกจต้องใช้ invoke-rc.d เพื่อเรียกใช้ /etc/init.d/* initscripts แทนที่จะเรียกใช้โดยตรง

Debian ได้รับการใช้sysv-initและจะเปลี่ยนโดยตรงไปและผมคิดว่านโยบายคู่มือจะมีการปรับปรุงในเวลาที่กำหนดในการอ้างถึงsystemd systemctlแต่สิ่งที่ผมไม่แน่ใจเกี่ยวกับคือ: การใช้งานที่ฉันควรinvoke-rc.dแทนservice? ฉันสามารถบอกได้dpkgว่าฉันสนใจไฟล์บางไฟล์ (ผ่านทริกเกอร์) ดังนั้นจึงมีวิธีที่จะบอกได้dpkgว่าฉันสนใจบริการบางอย่างเช่นกันและdpkgเริ่มการรีสตาร์ท / โหลดใหม่หรือไม่

เพื่อชี้แจง: ฉันไม่ได้เขียนสคริปต์ init ฉันกำลังจัดเตรียมแพ็คเกจที่มีการกำหนดค่าสำหรับแอปพลิเคชันอื่น ๆ เช่น Puppet, NTP เป็นต้นดังนั้นฉันจึงหยุดและเริ่มบริการที่เกี่ยวข้องในสคริปต์

นี่ยกตัวอย่างเช่นเป็นปัญหาเกี่ยวกับการเทียบท่าเทียบinvoke-rc.d serviceปัญหายังคงเปิดอยู่โดยมีคนคนหนึ่งอาจเป็นผู้ดูแลแสดงความคิดเห็นว่าพวกเขาสนใจที่จะทำสิ่งนี้อย่างถูกวิธี - แน่นอนว่าพวกเราทั้งคู่ไม่แน่ใจว่ามันคืออะไร (คำถามของฉันไม่ขึ้นอยู่กับปัญหานั้น)

คำตอบ:


5

ฉันจะใช้สคริปต์ก่อน / หลังโพสต์ต่อไป

preinst - สคริปต์นี้ทำงานก่อนที่แพคเกจนั้นจะถูกแตกไฟล์จากไฟล์ Debian archive (".deb") สคริปต์ 'preinst' จำนวนมากจะหยุดบริการสำหรับแพ็คเกจที่กำลังอัปเดตจนกว่าการติดตั้งหรืออัปเกรดจะเสร็จสิ้น (หลังจากดำเนินการเรียกใช้สคริปต์ 'postinst' สำเร็จ)

postinst - สคริปต์นี้จะทำการกำหนดค่าที่จำเป็นของแพคเกจ foo ให้เสร็จสมบูรณ์เมื่อ foo ถูกคลายออกจากไฟล์ Debian (".deb") บ่อยครั้งที่สคริปต์ 'postinst' ขอให้ผู้ใช้ป้อนข้อมูลและ / หรือเตือนผู้ใช้ว่าถ้าเขายอมรับค่าเริ่มต้นเขาควรจำไว้ว่าให้ย้อนกลับไปและกำหนดค่าแพคเกจนั้นใหม่ตามสถานการณ์ที่รับประกัน สคริปต์ 'postinst' จำนวนมากจากนั้นเรียกใช้คำสั่งใด ๆ ที่จำเป็นในการเริ่มหรือเริ่มบริการใหม่เมื่อมีการติดตั้งหรืออัพเกรดแพ็คเกจใหม่

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

ไวยากรณ์ของการเรียกใช้เริ่มต้น | หยุด | เริ่มเขียนใหม่เป็นเงื่อนไขดูhttps://www.debian.org/doc/debian-policy/ch-opersys.htmlส่วน 9.3.3.2 การเรียกใช้ initscripts

ถ้า invoke-rc.d> / dev / null 2> & 1; แล้วก็

แพ็คเกจ invoke-rc.d

อื่น

/etc/init.d/package

Fi

ดังนั้น ...

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

และเพิ่มเงื่อนไขอื่นสำหรับ systemd เมื่อจำเป็น;)

ดังนั้นใช่วิธีที่เหมาะสมในการเริ่ม | หยุด | เริ่มบริการใหม่อยู่กับสคริปต์ wrapper ที่เหมาะสม (invoke-rc.d / system) เมื่อเป็นไปได้แทนที่จะเรียกสคริปต์ init (/etc/init.d/package) และ กลับไปที่สคริปต์ /etc/init.d เมื่อไม่มี wrapper


นั่นเป็นคำตอบที่ฉันสงสัยมากที่สุดยกเว้นแค่ข้อเดียว invoke-rc.dหน้าคนและเอกสารนโยบาย Debian บอกเราที่จะใช้ในการเชื่อมต่อกับ/etc/init.d/สคริปต์ (อาจจะเป็นเพราะพวกเขายังคงใช้ SysV-init) วิธีการที่จะเปลี่ยนกับพุ่งพรวดหรือ systemd?
muru

อัปเดตคำถามของคุณหรือโพสต์ลิงก์ไปยังข้อมูลที่คุณกำลังอ่าน ฉันไม่เห็นอะไรเลยในหน้าคนเกี่ยวกับบรรจุภัณฑ์ ฉันคิดว่ามันขึ้นอยู่กับบริการของคุณและสคริปต์เริ่มต้น (มันพุ่งพรวด? systemd?) คุณกำลังถาม askubuntu.com และ Ubuntu ใช้การพุ่งพรวดดังนั้นaskubuntu.com/questions/58404/how-to-start-and-stop -a หากแพ็คเกจของคุณใช้สคริปต์ init ตัวเก่าควรจะแปลงเป็นแบบพุ่งพรวดตอนนี้และ systemd ในระยะยาว
Panther

ฉันได้อัปเดตคำถามแล้ว
muru

ไม่มีคำตอบเดียวหรือง่ายสำหรับคำถามเพราะ "ขึ้นอยู่กับ" นี่เป็นสถานการณ์ชั่วคราวเล็กน้อยเนื่องจากการย้ายไปข้างหน้า Ubuntu และเดเบียนจะใช้ systemd คุณควรใช้ invoke-rc.d สำหรับบริการต่างๆบน Debian (หรือ Ubuntu) ที่ใช้ sysv-init และบริการ ... บน Ubuntu สำหรับบริการที่ใช้ upstart มันเป็นสคริปต์ดังนั้นจึงมีความคิดสร้างสรรค์หากต้องการinvoke-rc.d ... || service ...
Panther

ฉันคิดว่าคุณกำลังถามว่าคุณควรใช้สคริปต์ก่อน / หลังโพสต์ไม่ใช่ไวยากรณ์ของสคริปต์ของคุณ
Panther

0

วิธีที่ดีกว่าสำหรับระบบ systemd คือการใช้deb-systemd-วิงวอน


1
deb-systemd-invokeโปรดให้ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการใช้
Cynplytholowazy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.