31

У меня есть следующая команда 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>

5 ответов5

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 для получения дополнительной информации.

4

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

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

sudo chown root:admin script_to_run_by_launchd
3

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

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

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

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

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

[...]

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

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 очень хорош.

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