Запутался в «/etc/init.d» и сервисах в «/ lib / systemd / system»

15

Я совершенно новичок в мире Linux, поэтому извините за что-то не так, я могу сказать.

Я пытаюсь запустить базу данных Mongo на компьютере с Debian 8.5. Когда я установил пакет (предварительно собранный с percona.com), я заметил следующие файлы:

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

О /etc/init.d/mongod

Я понимаю, что это вызывается (при условии, что оно зарегистрировано через update-rc.d) при загрузке / в других конкретных состояниях системы (я не хочу разбираться в технических вопросах по этому вопросу, я поглощаю много информации, и это кажется менее важным).

Это прекрасно для меня. Сценарий выполняет много инициализации и, наконец, запускает демон Монго. Кажется, у него есть «триггеры» для запуска, остановки, перезапуска и т. Д., И, насколько я понимаю, я могу активировать их с помощью sudo service mongod <action>.

О /lib/systemd/system/mongod.service

Этот файл, кажется, делает то же самое (т.е. запускает монго), но с меньшей конфигурацией, только одна строка в параметре 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

Насколько я понимаю, это может быть вызвано sudo systemctl start mongod.

  • Я не понимаю, вызывается ли это при загрузке или нет.

  • Я не понимаю, зачем нужны два этих «служебных» файла и как я могу избавиться от одного (возможно, от одного из файлов / lib / systemd, поскольку он намного проще).

  • Я не понимаю, есть ли связь между ними.

  • Я прочитал, что systemctlработает и со init.dскриптами, и в этом случае я не понимаю, какой из двух файлов будет запущен systemctl mongod start.

Я думаю, что есть некоторая избыточность, и я должен выбрать только один из двух способов. И я хочу быть уверен, что это

  • вызывается при загрузке
  • вызывается по команде (как serviceили systemctl).

Не могли бы вы помочь мне очистить мой разум? С помощью некоторых комментариев я, вероятно, смогу сфокусировать и сузить вопрос.

natario
источник

Ответы:

12

Если у вас есть и init.dсценарий, и .serviceфайл systemd с одинаковым именем, systemd будет использовать служебный файл для всех операций. Я верю, что serviceкоманда просто перенаправит на systemd. Сценарий init.d будет игнорироваться.

Использование systemd. Это новое в Debian 8, но это по умолчанию. Служебные файлы Systemd должны выглядеть проще, чем сценарии init.d. Вы не упомянули какую-либо конкретную нужную вам функцию, которая не поддерживается службой systemd.

Если бы служебный файл не был включен, systemdс радостью использовал бы скрипт init.d. Таким образом, разработчик пакета mongod говорит вам, что они считают, что это определение systemd лучше :).

Посмотрите на вывод systemctl status mongod. Если служба включена для запуска во время загрузки, в Loaded:строке будет показано «включено». В противном случае вы можете использовать systemctl enable mongod. Вы также можете включить эту опцию --now, и она запустит mongod одновременно.

sourcejedi
источник
Спасибо! Я собираюсь изучить systemd и в конечном итоге использовать его. Сейчас я хотел отключить это и, наконец, запустить скрипт init.d, над которым я работал. Я пошел systemctl disable mongod:; затем переименовывается в mongod.service в mongod-backup.service; тогда systemctl daemon-reload. Как вы думаете, это было правильно? Я читал, что вы не должны изменять файлы в / lib / systemd / system /, но без переименования systemctl продолжал игнорировать скрипт init.d.
Натарио
Файлы в / lib / systemd не являются conffiles. Я действительно не могу рекомендовать установить пакет Debian и изменить его файлы (и позже обновить пакет). Вместо этого вам следует переименовать скрипт init.d, над которым вы «работаете» (предположительно, модифицируете?). Скрипты init.d, как правило, являются conffiles. Если обновление изменяет conffile (для этого не должно быть никаких причин), оно сначала предупредит вас. В этом случае я ожидаю, что он уведомит вас, если когда-нибудь станет доступной обновленная версия (эффективно) удаленного сценария init.d.
sourcejedi
Возможно, вам нужно будет добавить зависимости заказа от вашего нового сервиса, к сервисам, от которых зависел mongod. Также есть шанс, что вам придется удалить некоторые строгие зависимости, но я бы не подумал. Безопасный способ изменить уязвимые службы - скопировать их /etc/systemd/system/и изменить копию.
Sourcejedi
В общем, я думаю, что придерживаться systemd проще. Сейчас вы изучаете функции bash, init-functions и system-back-compat. Поскольку вы не изучаете чистую систему инициализации SysV, если вы когда-либо будете использовать такую ​​систему, есть риск, что вы ожидаете, что функции на самом деле исходят от systemd.
sourcejedi