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: Я перешел на общедоступную бета-версию Yosemite 3 и изменил свой агент на этот

<?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 , чтобы загрузить его.

7 ответов7

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
5

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

4

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

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

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

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

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

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

2

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

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

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

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

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

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

2

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

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

2

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

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

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

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

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 возвращает вас в ваш домен и позволяет добавить задачу в качестве агента запуска пользователя.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .