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

45434
Emmanuel Mwangi

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

5 ответов на вопрос

46
Chealion

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

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

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

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

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

Property lists in LaunchAgents also work, but you have to load both agents and daemons with sudo:

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

If the plist doesn't have a disabled key, it is loaded on the next login or restart by default, and -w is not necessary.

Technical Note TN2083: Daemons and Agents:

A daemon is a program that runs in the background as part of the overall system (that is, it is not tied to a particular user). A daemon cannot display any GUI; more specifically, it is not allowed to connect to the window server.

[...]

An agent is a process that runs in the background on behalf of a particular user. Agents are useful because they can do things that daemons can't, like reliably access the user's home directory or connect to the window server.

3
Cory Klein

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

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

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

2
Jose Leon

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 9 лет назад 0

Похожие вопросы