วิธีการแพคเกจบริการ systemd?


13

ฉันพยายามจัดทำแอพพลิเคชั่นแบบโมโนให้เรียกใช้เป็นบริการ systemd

ฉันได้ทำตามคำแนะนำที่นี่: https://wiki.debian.org/Teams/pkg-systemd/Packaging

ฉันได้เพิ่ม dh-systemd (> = 1.5) ในการสร้างไฟล์ควบคุม debian ของฉันแล้ว

ฉันได้เพิ่ม - with = systemd ไปยังไฟล์กฎของฉันดังนี้:

%:
    dh $@ --with=cli --with=systemd

ฉันเพิ่มไฟล์บริการของฉันลงในโฟลเดอร์ debian ของฉันชื่อ mypackage.service พร้อมเนื้อหาดังต่อไปนี้:

[Unit]
Description=My Service Description
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/mono /usr/lib/mypackage/myservice.exe

[Install]
WantedBy=multi-user.target

อย่างไรก็ตามการสร้างให้คำเตือนและข้อผิดพลาด lintian ต่อไปนี้:

Now running lintian...
E: mypackage: postrm-does-not-call-updaterc.d-for-init.d-script     etc/init.d/mypackage
W: mypackage: init.d-script-not-marked-as-conffile etc/init.d/mypackage
E: mypackage: init.d-script-not-included-in-package etc/init.d/mypackage

นี่ทำให้ฉันสับสนด้วยเหตุผลหลายประการ

  1. คำเตือนเหล่านี้เกี่ยวกับ init.d ซึ่งเป็นระบบเก่าซึ่งถูกแทนที่ด้วย systemd ข้อผิดพลาดและคำเตือนเหล่านี้ไม่ถูกต้อง debuild คิดว่าฉันใช้ init.d เพราะฉันกำหนดค่าแพ็คเกจผิด
  2. ฉันรู้สึกว่า --with = systemd จะสร้างสคริปต์เหล่านี้ให้ฉัน

ปรับปรุง

ไฟล์ postrm ที่สร้างขึ้นมีดังนี้:

#!/bin/sh
set -e
# Automatically added by dh_systemd_start
if [ -d /run/systemd/system ]; then
    systemctl --system daemon-reload >/dev/null || true
fi
# End automatically added section
# Automatically added by dh_systemd_enable
if [ "$1" = "remove" ]; then
    if [ -x "/usr/bin/deb-systemd-helper" ]; then
        deb-systemd-helper mask mypackage.service >/dev/null
    fi
fi

if [ "$1" = "purge" ]; then
     if [ -x "/usr/bin/deb-systemd-helper" ]; then
        deb-systemd-helper purge mypackage.service >/dev/null
        deb-systemd-helper unmask mypackage.service >/dev/null
    fi
fi
# End automatically added section

ไฟล์ prerm ที่สร้างขึ้นมีดังต่อไปนี้:

#!/bin/sh
set -e
# Automatically added by dh_systemd_start
if [ -d /run/systemd/system ]; then
    deb-systemd-invoke stop mypackage.service >/dev/null
fi
# End automatically added section
# Automatically added by dh_installinit
if [ -x "/etc/init.d/mypackage" ] || [ -e "/etc/init/mypackage.conf" ]; then
    invoke-rc.d mypackage stop || exit $?
fi
# End automatically added section

แพคเกจติดตั้งดีจริงและบริการเริ่มต้นอย่างถูกต้อง ข้อผิดพลาด lintian กำลังเป็นกังวลและฉันต้องการไปที่ด้านล่างของพวกเขา


postrmสคริปต์ของคุณมีอะไรบ้าง มันมีบอยเลอร์สำเร็จรูปหรือไม่?
muru

มันอยู่ที่ไหน? มันคืออะไร? คำแนะนำไม่ได้บอกว่าจะสร้างขึ้นมาและตัวอย่างที่เชื่อมโยงนั้นไม่มี ดังนั้นมันอาจถูกสร้างโดย dh-systemd หรือไม่มีอยู่จริง
จรจัด

2
ดูdebian.org/doc/debian-policy/ch-maintainerscripts.htmlและwiki.debian.org/MaintainerScripts หากคุณไม่ทราบว่าสิ่งเหล่านี้คืออะไร debhelper (aka dh) ควรสร้างสิ่งที่เหมาะสม เรียกใช้dpkg-deb --controlบนไฟล์ deb สร้างและมองในที่เพิ่งสร้างDEBIANไดเรกทอรีสำหรับpostinst, postrmไฟล์
muru

ตกลงจะทำตามคำแนะนำที่บอกว่า "หลังจากสร้างขึ้นใหม่แพ็คเกจของคุณจะมีรหัสเพิ่มเติมในสคริปต์บำรุงรักษา postinst, prerm และ postrm" เมื่อได้รับสิ่งเหล่านี้เป็นสิ่งที่สร้างขึ้นโดยอัตโนมัติฉันมีโอกาสเพียงเล็กน้อยเท่านั้น
จรจัด

อัปเดตคำถามด้วยสคริปต์สร้าง postrm และ prerm
trampster

คำตอบ:


5

ฉันพบปัญหานี้เช่นกัน นี่คือสิ่งที่ฉันเกิดขึ้น:

คุณจะต้องการแทนที่ dh_installinit และ dh_systemd_start นี่คือตัวอย่างจากบริการบริดจ์เครือข่ายของฉัน:

#!/usr/bin/make -f

PKGDIR=debian/tmp

%:
    dh $@ --with systemd

override_dh_installinit:
    dh_systemd_enable -popenstack --name=openstack openstack.service
    dh_installinit -popenstack --no-start --noscripts
    dh_systemd_start -popenstack --no-restart-on-upgrade

override_dh_systemd_start:
    echo "Not running dh_systemd_start"

แหล่งที่มาเต็มรูปแบบของแพคเกจของฉันสามารถพบได้ที่นี่: https://github.com/Ubuntu-Solutions-Engineering/openstack-deb/tree/master/debian

ฉันยังใช้https://github.com/lxc/lxd-pkg-ubuntu/blob/dpm-xenial/debian/rulesเป็นข้อมูลอ้างอิง

หวังว่านี่จะพาคุณไปตามที่คิดเอาไว้ซักพักนึง


4

เมื่อไม่รวมสคริปต์เริ่มต้น SysV หรือ Upstart แนะนำdh_installinitให้ไม่แก้ไขpostinst/ postrm/ prermสคริปต์ dh_systemdจะจัดการกับมัน

override_dh_installinit:
    dh_installinit --noscripts

สิ่งนี้ใช้กับdebhelperระดับความเข้ากันได้ <10 และ 10 แม้ว่าจะdh_systemdถูกผสานเข้าdebhelperด้วยกัน

ตามhttps://bugs.debian.org/cgi-bin/bugreport.cgi?bug=800043 debhelperระดับความเข้ากันได้ 11> = นี้จะมีการแก้ไขนี้

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