Apa cara yang tepat untuk memulai kembali layanan dependen saat instalasi paket?

10

Saya membuat paket konfigurasi, dan ingin menghentikan dan memulai kembali layanan yang konfigurasinya terpengaruh. Sekarang saya menggunakan service [stop|restart]di {pre,post}{inst,rm}jalan. Saya membaca pertanyaan di suatu tempat yang invoke-rc.dmerupakan cara yang benar , karena itu menghormati preferensi pengguna tentang layanan. Namun, saya tidak dapat menemukan panduan tentang ini. Adakah yang tahu tentang pedoman semacam itu? Atau punya saran ke arah mana saya harus memilih? Paket ini untuk penggunaan internal, dan kemungkinan hanya untuk 14,04 untuk dua tahun ke depan. Namun, saya ingin meninggalkan keadaan sebersih mungkin untuk penerus saya, begitu systemdjuga dalam pikiran saya.

Dari invoke-rc.dhalaman manual :

Semua akses ke skrip init oleh skrip pengelola paket Debian harus dilakukan melalui invoke-rc.d .

Dari Manual Kebijakan Debian, Bab 9, Bagian 3.3 :

Pemelihara harus menggunakan lapisan abstraksi yang disediakan oleh program update-rc.d dan invoke-rc.d untuk menangani skrip init dalam skrip paket mereka seperti postinst, prerm dan postrm.

...

Skrip pengelola paket harus menggunakan invoke-rc.d untuk memanggil skrip init /etc/init.d/*, alih-alih memanggilnya langsung.

Debian telah menggunakan sysv-initdan akan beralih langsung ke systemd, dan saya kira manual kebijakan akan diperbarui pada waktunya untuk merujuk systemctl. Namun, apa yang saya tidak yakin tentang ini adalah: Haruskah saya menggunakan invoke-rc.dbukan service? Saya dapat mengatakan dpkgbahwa saya tertarik pada beberapa file (melalui pemicu), jadi apakah ada cara untuk mengatakan dpkgbahwa saya juga tertarik pada beberapa layanan dan mulai dpkgmelakukan restart / reload?

Untuk memperjelas: Saya tidak menulis skrip init. Saya menyediakan paket dengan konfigurasi untuk aplikasi lain, seperti Wayang, NTP, dll, jadi saya menghentikan dan memulai kembali layanan yang sesuai dalam skrip.

Di sini , misalnya, adalah masalah Docker tentang invoke-rc.dvs service. Masalahnya masih terbuka, dengan satu orang, mungkin seorang pengelola, berkomentar bahwa mereka pasti tertarik melakukan ini dengan cara yang benar - jelas tidak ada di antara kita yang yakin apa itu. (Pertanyaan saya terlepas dari masalah itu.)

muru
sumber

Jawaban:

5

Saya akan terus menggunakan skrip pre / post inst,

preinst - Skrip ini dieksekusi sebelum paket itu akan dibuka dari file arsip Debian (".deb"). Banyak skrip 'preinst' menghentikan layanan untuk paket yang sedang ditingkatkan hingga instalasi atau pemutakhirannya selesai (mengikuti keberhasilan pelaksanaan skrip 'postinst').

postinst - Skrip ini biasanya menyelesaikan konfigurasi apa pun yang diperlukan dari paket foo setelah foo dibuka dari file arsip Debian (".deb"). Seringkali, skrip 'postinst' meminta input dari pengguna, dan / atau memperingatkan pengguna bahwa jika ia menerima nilai default, ia harus ingat untuk kembali dan mengkonfigurasi ulang paket itu ketika situasinya memungkinkan. Banyak skrip 'postinst' kemudian menjalankan perintah yang diperlukan untuk memulai atau memulai kembali layanan begitu paket baru telah diinstal atau ditingkatkan.

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

Sintaks menjalankan start | stop | restart ditulis sebagai kondisional, lihat https://www.debian.org/doc/debian-policy/ch-opersys.html bagian 9.3.3.2 Menjalankan skrip init

jika yang memanggil-rc.d> / dev / null 2> & 1; kemudian

paket invoke-rc.d

lain

/etc/init.d/package

fi

jadi ...

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

dan tambahkan syarat lain untuk systemd saat dibutuhkan;)

Jadi ya, cara yang tepat untuk memulai | stop | me-restart layanan adalah dengan skrip wrapper yang sesuai (invoke-rc.d / system), jika memungkinkan, alih-alih memanggil skrip init (/etc/init.d/package) dan kembali ke skrip /etc/init.d ketika tidak ada pembungkus yang tersedia.

Harimau kumbang
sumber
Itu cukup banyak menjawab sebagian besar keraguan saya, kecuali satu. The invoke-rc.dhalaman manual dan dokumentasi kebijakan Debian memberitahu kita untuk menggunakannya sehubungan dengan /etc/init.d/skrip (mungkin karena mereka masih digunakan SysV-init). Bagaimana hal itu berubah dengan Upstart atau systemd?
muru
Perbarui pertanyaan Anda atau poskan tautan ke informasi yang Anda baca. Saya tidak melihat apa pun di halaman manual tentang pengemasan. Saya kira itu tergantung pada layanan Anda dan skrip init (apakah ini pemula? Systemd?) Anda bertanya di askubuntu.com, dan ubuntu menggunakan pemula, jadi askubuntu.com/questions/58404/how-to-start-and-stop -sebuah layanan . Jika paket Anda menggunakan skrip init lama, itu harus dikonversi menjadi pemula untuk saat ini dan sistemd dalam jangka panjang.
Panther
Saya telah memperbarui pertanyaan.
muru
Tidak ada jawaban yang mudah atau tunggal untuk pertanyaan karena "tergantung" Ini adalah sedikit situasi sementara karena bergerak maju ubuntu dan debian keduanya akan menggunakan systemd. Anda harus menggunakan invoke-rc.d untuk layanan di Debian (atau Ubuntu) yang menggunakan sysv-init dan layanan ... di Ubuntu untuk layanan yang menggunakan pemula. Ini scripting jadi kreatif jika perluinvoke-rc.d ... || service ...
Panther
Saya pikir Anda bertanya apakah Anda harus menggunakan skrip inst pre / post, bukan sintaks skrip Anda.
Panther
0

Cara yang lebih baik untuk sistem systemd adalah menggunakan deb-systemd-invoke .

Razvan Grigore
sumber
1
Tolong beri informasi lebih lanjut tentang cara menggunakan deb-systemd-invoke.
Cynplytholowazy