Не могу запустить демон с launchctl в Йосемити

27

У меня есть демон launchd, ~/Library/LaunchAgentsкоторый хорошо работал в Mavericks. Но это не начнется в публичной бета-версии Yosemite. Демон plist выглядит так (мое имя пользователя darksairс UID 501)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>LaunchOnlyOnce</key>
    <false/>
    <key>UserName</key>
    <string>darksair</string>
    <key>ProcessType</key>
    <string>Standard</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

В основном это должно выполняться ~/bin/retrmail.pyкаждые 5 минут.

Я заметил, что в Yosemite launchd обновлен до 2.0, а launchctl имеет новые команды. Я пытался

sudo launchctl kickstart user/501/org.darksair.retrmail

и сказал

Could not find service "org.darksair.retrmail" in domain for uid: 501

Я тоже пробовал старую школу

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

и сказал

/Users/darksair/Library/LaunchAgents/retrmail.plist: Path had bad ownership/permissions

Файл принадлежит мне и группе сотрудников. Я пробовал оба разрешения 644 и 600 с той же ошибкой.

Так кто-нибудь знает, как правильно запустить демон launchd в Yosemite?


ОБНОВЛЕНИЕ: похоже, мой файл агента запуска должен принадлежать root:wheel. После того, как я попробовал, я попробовал

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

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


ОБНОВЛЕНИЕ 2: Нет, это не работает должным образом. Он запускался только один раз, но не снова, как если бы он был выгружен.


ОБНОВЛЕНИЕ 3: Я обновился до общедоступной бета-версии 3 Yosemite и изменил свой агент на этот

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>UserName</key>
    <string>darksair</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

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


В заключение я обнаружил, что мне нужно сменить владельца plist root:wheel, чтобы загрузить его.

MetroWind
источник
Это работает в финале Йосемити?
TJ Luoma
@TJLuoma: да. Пока plist принадлежит root: wheel.
MetroWind

Ответы:

21

От man launchctl

Обратите внимание, что файлы конфигурации для каждого пользователя (LaunchAgents) должны принадлежать пользователю root (если они находятся в / Library / LaunchAgents) или пользователю, загружающему их (если они находятся в $ HOME / Library / LaunchAgents). Все общесистемные демоны (LaunchDaemons) должны принадлежать пользователю root. Файлы конфигурации должны запрещать групповые и мировые записи. Эти ограничения действуют по соображениям безопасности, поскольку возможность записи в файл конфигурации launchd позволяет указать, какой исполняемый файл будет запущен.

Исправить это

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist
diimdeep
источник
2
«Или пользователь, загружающий их» <- это та часть, с которой у меня проблема.
MetroWind
2
Я не парень из Unix, но там написано: «Запретить групповые и мировые записи». Так как это все еще нужно читать, не так ли chmod 644?
Джейсон
5

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

AlexPantea
источник
4

Нашел решение.

Правильная команда в этом случае

launchctl bootstrap gui/501 ~/Library/LaunchAgents/retrmail.plist

И разгрузить,

launchctl bootout gui/501 ~/Library/LaunchAgents/retrmail.plist

Не знаю, зачем launchctl loadнужен root, но загрузка / выгрузка все равно не рекомендуется.

MetroWind
источник
Страницы справочной страницы загрузки не являются bootcut. Я думаю, что автозамена получила вас, так как на моей машине это меняет загрузку на bootcut.
Стив Мозер
@MetroWind Я получаю Не удалось найти домен для ошибки Code = 112 с вышеуказанной командой. это не соответствует. какая-нибудь подсказка?
Параг Бафна
Вы все еще нуждались в chmod& chown?
Итачи
@ Итачи, нет. Оставив владельца по умолчанию и разрешение должно быть в порядке.
MetroWind
@ParagBafna, я не уверен. Может быть, ваш UID не 501?
MetroWind
3

С этим тоже столкнулся, пытаясь использовать пользователя, не принадлежащего root .plist (как это должно уметь)

$ load ~/Library/LaunchAgents/com.blash.blah.plist
Could not find domain for 

Я был удаленно подключен к этой машине, пока я НЕ вошел в систему с консоли (без головы), что казалось моей проблемой - по крайней мере, для служб, управляемых пользователями, необходимо, чтобы пользователь вошел в систему на главном экране (в итоге я сделал вход через удаленное управление, так как это безголовый компьютер)

ИМО, если вы хотите, чтобы это работало, даже если вы не были лично для входа в систему, ваши варианты:

  • Сделайте вашу учетную запись автоматически (обратите внимание на безопасность, также без тега UserName, как указано в одном из ответов)

  • Сделайте файлы root-владельцами, как указано в различных предложениях (верните пользователю действительное обратно, используя UserName, как у вас уже есть)

nhed
источник
2
Огромное спасибо. Я нашел решение в вашем ответе.
Retraut
2

Вот глупая идея.

У меня была такая же ошибка, даже после того, как я обновился до Yosemite. Я ошибочно предположил, что это означало плохое владение / права доступа к файлу .plist, когда на самом деле по какой-то причине бинарный файл, на который я ссылался в plist (в моем случае cassandra), потерял свой исполняемый бит.

chmod + x'ing это исправило это.

Вероятно, не ваша проблема, но, возможно, стоит попробовать :)

DanielSmedegaardBuus
источник
Это не относится к моему делу, хотя. Мой исполняемый файл имеет бит разрешения x. Но все равно спасибо за ответ. Надеюсь, что это может помочь другим людям.
MetroWind
2

Удалить UserName ключ и строку.

Проблема в том, что UserNameключ можно использовать только в том случае, если процесс запущен пользователем root. Он может быть запущен как root, только если plist принадлежит root. По сути, процесс запускается пользователем root и затем назначается указанному пользователю. Если вы хотите, чтобы этот процесс выполнялся как вы сами, поместите plist в папку ~ / Library / LaunchAgents и удалите ключ UserName.

Петр Т Боссе II
источник
Он работает после того, как я убрал опцию UserName для zabbix_agend. Спасибо! - gist.github.com/chusiang/04db38f5173784e33b68
Чу-Саинг Лай
Странно ... Он все равно не загрузится после того, как я
уберу
1

Вы пытались вручную перезагрузить агент, у которого были разрешения пользователя? Я не совсем понимаю, почему все это требуется, но я считаю, что вам нужно присоединиться к домену вашего пользователя (к которому, похоже, вы не привязаны, когда запускаете от имени пользователя root). Использование этих функций для повторного подключения работало для меня.

function as_user {
    local user="$1"
    local user_pid=$(ps -axj | awk "/^$user / {print \$2;exit}")
    local command="sudo launchctl bsexec $user_pid sudo -u '$user' $2"
    echo "Running:"
    echo "$command"
    eval $command
}

function as_current_user {
    as_user "$(whoami)" "$*"
}

function reload_agent {
    as_current_user launchctl unload "$1"
    as_current_user launchctl load "$1"
}

Вы бы использовали это следующим образом:

reload_agent ~/Library/LaunchAgents/com.hw.helloworld.plist

Bsexec возвращает вас в ваш домен и позволяет добавить задачу в качестве агента запуска пользователя.

imalison
источник
В нем говорится: /Users/darksair/Library/LaunchAgents/retrmail.plist: операция уже выполняется. На данный момент мои вопросы в основном: почему не сработала команда кикстарта? И почему я должен установить право собственности на список пользователей root?
MetroWind
1
Вы НЕ должны устанавливать владельца вашего файла plist как root; все в ~ / Library / LaunchAgents должно принадлежать пользователю, которому принадлежит этот каталог. Операция «Операция уже началась», когда я не выгружал команду до ее загрузки. Используете ли вы функцию, которую я предоставил?
Ималисон
Да. Я использовал твои функции. И я действительно выгрузил список первым ...
MetroWind
Я просто попытался загрузить первый предоставленный вами список, и он сработал для меня. Какие разрешения установлены для файла?
Ималисон
Это невероятный кусок кода для многих вещей. Я использую смесь сценариев puppet и custom bash для управления множеством различных устройств MacOS, и случайные проблемы, связанные с неправильным сеансом аудита безопасности или доменом пользователя, встречаются очень часто. Отличная работа!
Эндрю Уайт