Bingung tentang "/etc/init.d" dan layanan di "/ lib / systemd / system"

15

Saya benar-benar baru di dunia linux, jadi maaf untuk kesalahan yang saya katakan.

Saya mencoba menjalankan DB Mongo pada mesin Debian 8.5. Ketika saya menginstal paket (pre built from percona.com), saya perhatikan file-file berikut:

/etc/init.d/mongod (1)
/lib/systemd/system/mongod.service (2)

Tentang /etc/init.d/mongod

Saya mengerti bahwa ini disebut (selama terdaftar melalui update-rc.d ) pada saat boot / di negara sistem tertentu lainnya (tidak ingin mendapatkan teknis tentang ini, saya menyerap banyak informasi dan ini tampaknya kurang penting).

Ini sangat baik untuk saya. Script melakukan banyak inisialisasi dan akhirnya meluncurkan daemon mongo. Tampaknya memiliki "pemicu" untuk memulai, menghentikan, memulai kembali, dll dan sejauh yang saya mengerti saya dapat memicu mereka dengansudo service mongod <action> .

Tentang /lib/systemd/system/mongod.service

File ini tampaknya melakukan hal yang sama (mis. Jalankan mongo), tetapi dengan konfigurasi yang lebih sedikit, hanya satu baris dalam parameter ExecStart:

[Unit]
Description=MongoDB (High-performance, schema-free document-oriented database)
After=time-sync.target network.target
[Service]
Type=forking
User=mongod
Group=mongod
PermissionsStartOnly=true
EnvironmentFile=/etc/default/mongod
ExecStart=/usr/bin/env bash -c "/usr/bin/mongod $OPTIONS > ${STDOUT} 2> ${STDERR}"
PIDFile=/var/run/mongod.pid
[Install]
WantedBy=multi-user.target

Sejauh yang saya mengerti ini bisa dipicu dengan sudo systemctl start mongod.

  • Saya tidak mengerti apakah ini dipanggil saat boot atau tidak.

  • Saya tidak mengerti mengapa kebutuhan untuk dua file 'layanan' ini, dan bagaimana saya bisa menghilangkan satu (mungkin yang ada di / lib / systemd, karena jauh lebih sederhana).

  • Saya tidak mengerti apakah ada hubungan di antara keduanya.

  • Saya telah membaca yang systemctlberfungsi pada init.dskrip juga, dan dalam hal ini saya tidak mengerti yang mana dari dua file yang akan dipicu oleh systemctl mongod start.

Saya pikir ada beberapa redundansi dan saya harus memilih hanya satu dari dua cara. Dan saya ingin memastikan itu

  • dipanggil saat boot
  • dapat dipanggil dengan perintah (suka serviceatau systemctl).

Bisakah Anda membantu saya menjernihkan pikiran? Dengan bantuan beberapa komentar saya mungkin dapat fokus dan mempersempit pertanyaan.

natario
sumber

Jawaban:

12

Ketika Anda memiliki kedua init.dskrip, dan .servicefile systemd dengan nama yang sama, systemd akan menggunakan file layanan untuk semua operasi. Saya percaya serviceperintah hanya akan mengarahkan ulang ke systemd. Skrip init.d akan diabaikan.

Gunakan systemd. Ini baru di Debian 8, tapi ini default. File layanan Systemd seharusnya terlihat lebih sederhana daripada skrip init.d. Anda tidak menyebutkan fitur spesifik apa pun yang Anda butuhkan yang tidak didukung oleh layanan systemd.

Jika file layanan tidak dimasukkan, systemddengan senang hati akan menggunakan skrip init.d. Jadi pengembang paket mongod memberi tahu Anda bahwa mereka menganggap definisi systemd ini lebih baik :).

Lihatlah output dari systemctl status mongod. Jika layanan diaktifkan untuk dimulai pada saat boot, Loaded:baris akan menunjukkan "diaktifkan". Kalau tidak, Anda bisa menggunakan systemctl enable mongod. Anda juga dapat memasukkan opsi --now, dan itu akan memulai mongod pada saat yang sama.

sourcejedi
sumber
Terima kasih! Saya akan belajar systemd dan akhirnya menggunakannya. Untuk saat ini saya ingin menonaktifkannya dan akhirnya menjalankan skrip init.d yang telah saya kerjakan. Saya pergi systemctl disable mongod:; kemudian berganti nama menjadi mongod.service menjadi mongod-backup.service; kemudian systemctl daemon-reload. Apakah Anda pikir ini benar? Saya telah membaca Anda tidak boleh memodifikasi file di / lib / systemd / system /, tetapi tanpa mengganti nama, systemctl terus mengabaikan skrip init.d.
natario
File-file di / lib / systemd bukan conffile. Saya benar-benar tidak bisa merekomendasikan menginstal paket debian dan memodifikasi file-nya (dan kemudian memperbarui paket). Alih-alih, Anda harus mengganti nama skrip init.d yang telah Anda "kerjakan" (mungkin memodifikasi?). skrip init.d cenderung berupa conffile. Jika pembaruan mengubah sebuah conffile (yang seharusnya tidak ada alasan untuk), itu akan memperingatkan Anda terlebih dahulu. Dalam hal ini saya akan berharap untuk memberi tahu Anda jika versi terbaru dari skrip init.d asli (yang dihapus) pernah tersedia.
sourcejedi
Mungkin Anda perlu menambahkan dependensi pemesanan pada layanan baru Anda, ke layanan yang bergantung pada mongod. Ada juga kemungkinan Anda harus menghapus beberapa dependensi yang ketat, tetapi saya tidak akan berpikir begitu. Cara aman untuk memodifikasi layanan yang terpengaruh adalah menyalinnya /etc/systemd/system/dan memodifikasi salinannya.
sourcejedi
Secara umum, saya pikir bertahan dengan systemd lebih sederhana. Anda sekarang mempelajari bash, fungsi init, dan fitur back-compat systemd. Karena Anda tidak belajar sistem init SysV murni, jika Anda pernah menggunakan sistem seperti itu, ada risiko Anda akan mengharapkan fitur yang sebenarnya berasal dari systemd.
sourcejedi