Как запустить команду launchd от имени пользователя root

32

У меня есть следующая команда launchctl как файл .plist. Он загружен и настроен на запуск один раз в день, но должен запускаться от имени пользователя root, и я не уверен, как это проверить.

Кроме того, это задание cron в основном копирует в каталог и запускает команду. Я уверен, что у launchd есть лучший способ указать каталог, в котором он должен запускать команду.

Как я знаю, что он запускается от имени root и есть ли лучший способ написать это?

<?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>dev.project.frontpage.feedparser</string>
    <key>ProgramArguments</key>
    <array>
        <string>cd</string>
        <string>/Users/eman/src/project/trunk/includes/;</string>
        <string>./feed-parser.php</string>
        <string>-c</string>
        <string>./feed-parser-config.xml</string>
    </array>
    <key>QueueDirectories</key>
    <array/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>12</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>WatchPaths</key>
    <array/>
</dict>
</plist>
Эммануэль Мванги
источник

Ответы:

46

В какой папке .plistхранится?

launchdзапускает Daemons ( /Library/LaunchDaemonsили /System/Library/LaunchDaemons) от имени пользователя root и запускает их независимо от того, вошли пользователи или нет. Агенты запуска ( /Library/LaunchAgents/или ~/Library/LaunchAgents/) запускаются, когда пользователь вошел в систему как этот пользователь. Вы не можете использовать setuid для смены пользователя, запускающего скрипт на демонах.

Поскольку вы захотите добавить его, /Library/LaunchDaemonsвам нужно убедиться, что вы загружаете его launchdс правами администратора (например, sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist).

Проверьте man launchdдля получения дополнительной информации.

Chealion
источник
Спасибо. Это именно то, что я искал, чтобы ответить на корень проблемы. Сценарий находится в / Library / LaunchDaemons, поэтому он уже запущен от имени пользователя root.
Эммануэль Мванги
Вопрос новичка: launchctlтребуется ли запуск для установки демона? Я имею в виду, не достаточно ли скопировать файл plist в соответствующий путь?
Клавдикс
@Claudix: Это правильно. Копирование конфигурации launchd на месте не достаточно - вам все еще нужно «включить» (launchctl load)
Chealion
4

Вы пытались использовать один из запущенных редакторов?

Чтобы убедиться, что он запускается с правами root, я уверен, что launchd запустит программы с правами root. Вы когда-нибудь задумывались о том, чтобы передать права собственности на скрипт руту с помощью chmod? Таким образом, он не будет работать, пока не будет запущен от имени пользователя root. Затем вам нужно убедиться, что он работает.

sudo chown root:admin script_to_run_by_launchd
hanleyp
источник
Я использовал Lingon для написания этого сценария. И я могу подтвердить, что он хорошо работает в Leopard.
Эммануэль Мванги
3

Списки свойств в LaunchAgents также работают, но вы должны загрузить как агентов, так и демонов с помощью sudo:

sudo chown root /Library/LaunchAgents/test.plist
sudo launchctl load /Library/LaunchAgents/test.plist

Если у plist нет отключенного ключа, он загружается при следующем входе в систему или перезапускается по умолчанию, и в -wэтом нет необходимости.

Техническое примечание TN2083: Демоны и агенты :

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

[...]

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

LRI
источник
3

Для Google, желающих специально запустить Launch Agent с привилегиями root, например, от Launch Daemon , это можно сделать следующим образом:

  • Создайте свой LaunchAgent в ~/Library/LaunchAgents
  • Запустите ваше приложение с sudoпомощью ProgramArgumentsсвойства в вашем списке
  • Установите NOPASSWDопцию для вашего приложения в/etc/resolvers.d

Для более подробной информации см. Этот и этот ответ.

Кори Кляйн
источник
2

LaunchControl сделал это безболезненным для меня в Йосемити. Он имеет приятный графический интерфейс перетаскивания, чтобы помочь вам создавать или редактировать сервисы. Было удивительно видеть все работающие службы, о которых я не знал.

меры

  1. Запустить LaunchControl
  2. Вверху слева смените GlobalDeamons и введите свой пароль администратора
  3. File-> New
  4. Под ярлыком дайте ему уникальное имя. Соглашение "com.company.appname"
  5. В разделе «Программа» для запуска используйте сценарий оболочки Unix или любую другую команду, которую вы предпочитаете БЕЗ аргументов.
  6. Если вашему приложению требуются аргументы, измените раскрывающееся поле с «Argv по умолчанию» на «Custom argv»
    1. Теперь укажите аргумент, который вы обычно используете, как если бы вы запускали его из фактической командной строки.
  7. Run at Load не является обязательным, вы решаете.
  8. С правой стороны перетащите StartInterval и установите нужный интервал. FAQ в меню Help очень хорош.
Хосе Леон
источник
Можете ли вы отредактировать свое сообщение, чтобы оно включало шаги, которые может предпринять заявитель для решения своей проблемы?
Cfinley