Dari init.d ke pemula, apakah ada jembatan?

11

Saya punya skrip yang sangat bagus untuk digunakan di /etc/init.d. Sebenarnya, saya punya banyak dari mereka, semua dibuat dengan Tanuki Java Service Wrapper.

Tampaknya bagi saya bahwa mungkin ada template sederhana untuk membungkus skrip shell seperti itu sebagai skrip pemula, tetapi sedikit googling tidak mengungkapkan satu.

Apakah saya melewatkan sesuatu?

bmargulies
sumber

Jawaban:

9

Saya tidak ingat pernah melihat template untuk ini. Ini agak ironis, namun, secara teknis, pemula yang memulai skrip init.d Anda di tempat pertama berkat pekerjaan kompatibilitas mundur rc dan rcS.

Saya akan mempertimbangkan untuk menulis ulang apa pun yang Anda miliki sebagai pekerjaan pemula, namun, saya tahu bahwa beberapa skrip sulit dikonversi, jadi inilah yang saya lakukan untuk sementara waktu pada beberapa skrip saya:

description "xyz"
author "xyz"
start on runlevel 5
stop on runlevel [!5]

pre-start script
    # do my work here to start the service
end script

post-stop script
    # do work here to stop the service
end script

Sekarang tergantung pada sifat layanan, apakah itu bertahan atau bercabang sendiri, Anda mungkin perlu menambahkan expect forkatau taskke file pekerjaan.

Hanya untuk menyelesaikan pemikiran, biasanya, ini semua yang ada untuk file pekerjaan pemula penuh. Semua pekerjaan pra mulai dilakukan, semua pembersihan dilakukan, satu-satunya yang tersisa adalah layanan itu sendiri yang biasanya ditambahkan dengan:

exec service_cmd
KFro
sumber
Di pemula, dokumentasi mengatakan bahwa level lari 3,4, dan 5 tidak digunakan. Jadi, Anda hanya perlu menggunakan run level 2.
djangofan
sudah lama, tapi saya cukup yakin 5 adalah sistem dengan GUI dimulai, setidaknya dulu.
Joseph Rogers
6

Jadi satu poin dari pekerjaan pemula adalah menjadi sederhana untuk ditulis.

Ada banyak keajaiban skrip shell di skrip init.d yang berulang-ulang. Pernyataan kasus, pelacakan pidfile, baris komentar lsb. Tidak begitu jelas cara menulis skrip init.d BAIK tanpa harus membacanya.

Jika Anda sudah melalui kesulitan menulis semua itu, maka Anda tidak perlu pekerjaan pemula kecuali, seperti yang saya sebutkan di komentar lain, Anda bergantung pada pekerjaan / acara pemula lainnya.

Tapi sungguh, pemula memang membuat segalanya sangat sederhana. Anda seharusnya tidak memerlukan pra-start kecuali Anda perlu mengatur semuanya seperti tmpdirs, ulimits, atau argumen runtime. Anda seharusnya tidak memerlukan post-stop kecuali Anda ingin memastikan Anda merapikan setelah layanan (layanan ini benar-benar harus membersihkan setelah itu sendiri pada keluar normal).

Seringkali skrip init.d raksasa dengan banyak opsi bermuara pada 10 - 15 baris pekerjaan pemula. Skrip init.d paling kompleks dapat membuat sebagian besar logikanya dibuang ke pre-start's. Kuncinya ada adalah hanya potongan kecil kode untuk mengatur lingkungan untuk proses, dan bukan logika penanganan start / stop / respawn / dll.

Bagian tersulit, dan yang paling sering salah dilakukan orang, adalah mengetahui kapan memulai / menghentikan pekerjaan mereka. start on runlevel [2345]tampaknya logis, tetapi mengabaikan fakta bahwa jaringan akan muncul secara paralel pada saat itu, seperti halnya mount sistem file lokal. Kuncinya adalah untuk mencoba dan mencari tahu persis hal-hal minimum yang Anda butuhkan (layanan lain, sistem file, jaringan, dll) untuk dijalankan, dan mulai ketika itu selesai. Kebanyakan layanan jaringan tradisional harus dilakukan start on (local-filesystems and net-device-up IFACE!=lo).

SpamapS
sumber
3

Saya pikir Upstart mempertahankan kompatibilitas ke belakang dengan skrip init SysV-style in /etc/init.d. Anda seharusnya dapat menggunakan skrip init Anda tanpa perubahan.

Ryan C. Thompson
sumber
Ya, tapi urutannya tidak lagi mudah diprediksi. Pekerjaan pemula mungkin dimulai sebelum / setelah skrip rc2.d / S99 saya berjalan. Jadi, segera setelah Anda bergantung pada layanan yang dikelola pemula, Anda membutuhkan pekerjaan pemula.
SpamapS
2
Sebagai hack, Anda bisa menghapus skrip init Anda dari runlevel tertentu, dan bukannya menambahkan banyak baris seperti /etc/init.d/myservice startuntuk /etc/rc.local, dalam urutan yang benar. Ini akan memastikan bahwa layanan Anda mulai terakhir, setelah semua layanan lainnya, termasuk yang dimulai oleh skrip init pemula.
Ryan C. Thompson