launchctl для mongod на macosx без homebrew

Вопрос или проблема

Мне интересно, почему я могу запустить эту команду из терминала:

sudo su mongodb -c "mongod --config /etc/mongod.conf"

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

Я могу запустить бинарный файл mongod так, как рекомендует mongo. То есть, я запускаю его как пользователя, которого я создал, с именем “mongodb”. Пользователь, под которым я вошел, не имеет доступа на чтение/запись к любым из директорий данных “mongodb” и т.д., что также является рекомендуемой конфигурацией безопасности. Но мой пользователь является sudoer и может “su” (переключаться между пользователями) на пользователя mongodb и запускать команду с sudo.

Тем не менее, launchctl не может запустить службу, когда мой пользователь входит в систему. Я создал и успешно инициализировал и запустил свой plist службы под

/Library/LaunchAgents/com.my.test.plist

Ниже приведены фрагменты из примеров конфигураций plist, которые я пробовал, и их результирующие ошибки:

<key>ProgramArguments</key>
<array>
  <string>su</string>
  <string>mongodb</string>
  <string>-c</string>
  <string>"mongod --config /etc/mongod.conf"</string>
</array>

Ошибка в журнале службы: su: Извините

<key>ProgramArguments</key>
<array>
  <string>sudo</string>
  <string>su</string>
  <string>mongodb</string>
  <string>-c</string>
  <string>"mongod --config /etc/mongod.conf"</string>
</array>

Ошибка в журнале службы: sudo: для чтения пароля требуется терминал; используйте опцию -S для чтения из стандартного ввода или настройте вспомогательную программу askpass

Я не хочу использовать опцию -S, потому что было бы ужасно хранить пароль root где-нибудь на моей системе. Также команду нужно запускать с помощью “sudo”, потому что согласно требованиям mongoDB, использование директории данных mongodb, файла /etc/mongod.conf, директории журналов и самого бинарного файла mongod должны быть только у пользователя “mongodb” (поэтому они создают пользователя “mongodb” с самого начала, а не просто рекомендуют вам использовать своего обычного пользователя для входа?)

<key>UserName</key>
<string>mongodb</string>
<key>ProgramArguments</key>
<array>
  <string>mongod</string>
  <string>--config</string>
  <string>/etc/mongod.conf</string>
</array>

При этой конфигурации в файл службы не записываются ошибки, но служба не работает. Когда я проверяю, почему, с помощью

launchctl print gui/$(id -u)/com.dit.test.plist 

Я обнаруживаю, что последний код выхода = 78: EX_CONFIG
sysexits

Мне интересно, почему я могу запустить эту команду из терминала:

sudo su mongodb -c "mongod --config /etc/mongod.conf"

но LaunchAgent не может запустить эту команду при входе в систему как root, чтобы мой mongodb всегда запускался как служба.

пожалуйста, воздержитесь от любых ответов с использованием homebrew. Суть этой установки заключается в том, чтобы не использовать homebrew (он не нужен) и научиться использовать launchctl напрямую, как это предполагает mongo.

Также я думал попробовать разместить свою службу в **/System/**Library/LaunchAgents/com.my.test.plist (потому что, возможно, LaunchAgent тогда не будет запрашивать ввод пароля root?), но это также невозможно, так как этот каталог и такой вид службы зарезервированы для программных служб, созданных Apple. Я также пробовал /Library.
/LaunchDaemon в некоторой степени с вариациями приведенных выше конфигураций plist с аналогичными результатами. Я также пробовал использовать
crontab -e
И запускать свои скрипты my.sh с @reboot без успеха

Ответ или решение

Для запуска службы MongoDB на macOS с использованием launchctl без использования Homebrew, потребуется правильно настроить конфигурацию LaunchAgent. Ваша ситуация ясно показывает, что существуют определенные препятствия при запуске команды через launchctl, по сравнению с терминальным вводом. Давайте рассмотрим шаги и рекомендации по исправлению этой проблемы.

Проблема

Вы можете успешно запускать команду для запуска mongod через терминал, используя sudo su mongodb -c "mongod --config /etc/mongod.conf", но эта команда не срабатывает при использовании LaunchAgents. Ошибки, с которыми вы сталкиваетесь, такие как su: Sorry и sudo: a terminal is required to read the password, указывают на то, что launchctl не может выполнить команду с необходимыми привилегиями, а также что он не может запросить пароль для выполнения команд, требующих суперпользовательских прав.

Решение

Чтобы правильно настроить запуск mongod как службы, выполните следующие шаги:

  1. Настройка LaunchAgent: Создайте файл конфигурации XML (plist) в /Library/LaunchAgents, если вы еще этого не сделали. Убедитесь, что у вас есть ограничения доступа для mongodb пользователя.

    Пример содержимого файла /Library/LaunchAgents/com.my.mongodb.plist:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
       <key>Label</key>
       <string>com.my.mongodb</string>
       <key>UserName</key>
       <string>mongodb</string>
       <key>ProgramArguments</key>
       <array>
           <string>/usr/local/bin/mongod</string>
           <string>--config</string>
           <string>/etc/mongod.conf</string>
       </array>
       <key>RunAtLoad</key>
       <true/>
       <key>StandardErrorPath</key>
       <string>/var/log/mongodb/mongod.err</string>
       <key>StandardOutPath</key>
       <string>/var/log/mongodb/mongod.out</string>
    </dict>
    </plist>

    Убедитесь, что пути к mongod и к логам указаны правильно.

  2. Права доступа: Убедитесь, что файл .plist создан с правильными правами доступа. Вы можете установить права доступа с помощью команды:

    sudo chown root:wheel /Library/LaunchAgents/com.my.mongodb.plist
    sudo chmod 644 /Library/LaunchAgents/com.my.mongodb.plist
  3. Загрузка службы: Для загрузки нового агента используйте:

    launchctl load /Library/LaunchAgents/com.my.mongodb.plist

    После этого вы можете проверить состояние службы:

    launchctl list | grep com.my.mongodb
  4. Логи: Проверьте, создались ли логи по указанным путям, чтобы отследить ошибки при запуске.

Заключение

Попробуйте вышеизложенные шаги и убедитесь, что конфигурация соответствует требованиям MongoDB. При исправлении ошибок в журнале об ошибках вы сможете понять, что именно идет не так. Убедитесь также, что все необходимые папки, такие как /var/log/mongodb/, существуют и имеют правильные права доступа.

С помощью данной настройки запуска, mongod должен автоматически стартовать от имени пользователя mongodb, что создает более безопасную среду, соответствующую рекомендациям MongoDB по работе с подключениями и хранением данных.

Оцените материал
Добавить комментарий

Капча загружается...