Вопрос или проблема
Мне интересно, почему я могу запустить эту команду из терминала:
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
как службы, выполните следующие шаги:
-
Настройка 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
и к логам указаны правильно. -
Права доступа: Убедитесь, что файл
.plist
создан с правильными правами доступа. Вы можете установить права доступа с помощью команды:sudo chown root:wheel /Library/LaunchAgents/com.my.mongodb.plist sudo chmod 644 /Library/LaunchAgents/com.my.mongodb.plist
-
Загрузка службы: Для загрузки нового агента используйте:
launchctl load /Library/LaunchAgents/com.my.mongodb.plist
После этого вы можете проверить состояние службы:
launchctl list | grep com.my.mongodb
-
Логи: Проверьте, создались ли логи по указанным путям, чтобы отследить ошибки при запуске.
Заключение
Попробуйте вышеизложенные шаги и убедитесь, что конфигурация соответствует требованиям MongoDB. При исправлении ошибок в журнале об ошибках вы сможете понять, что именно идет не так. Убедитесь также, что все необходимые папки, такие как /var/log/mongodb/
, существуют и имеют правильные права доступа.
С помощью данной настройки запуска, mongod
должен автоматически стартовать от имени пользователя mongodb
, что создает более безопасную среду, соответствующую рекомендациям MongoDB по работе с подключениями и хранением данных.