Как запустить команду launchd от имени пользователя root
У меня есть следующая команда 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 ответов
Какая папка .plist
Хранится в?
launchd
запускает демонов (/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
для дополнительной информации.
Для Google, желающих специально запустить LaunchAgent с привилегиями root, например, от LaunchDaemon, это можно сделать следующим образом:
- Создайте свой LaunchAgent в
~/Library/LaunchAgents
- Запустите ваше приложение с
sudo
черезProgramArguments
недвижимость в вашем списке - Установить
NOPASSWD
вариант для вашего приложения в/etc/resolvers.d
Вы пытались использовать один из запущенных редакторов?
- Lingon (заброшенный, но предположительно работает на Leopard и Snow Leopard)
- Launchd Editor
- launchctl
Чтобы убедиться, что он запускается с правами root, я уверен, что launchd запустит программы с правами root. Вы когда-нибудь задумывались о том, чтобы передать права собственности на скрипт руту с помощью chmod? Таким образом, он не будет работать, пока не будет запущен от имени пользователя root. Затем вам нужно убедиться, что он работает.
sudo chown root:admin script_to_run_by_launchd
Списки свойств в LaunchAgents также работают, но вы должны загрузить как агентов, так и демонов с помощью sudo:
sudo chown root /Library/LaunchAgents/test.plist
sudo launchctl load /Library/LaunchAgents/test.plist
Если у plist нет отключенного ключа, он загружается при следующем входе в систему или перезапускается по умолчанию, и -w
не обязательно.
Техническое примечание TN2083: Демоны и агенты:
Демон - это программа, которая работает в фоновом режиме как часть общей системы (то есть она не привязана к конкретному пользователю). Демон не может отображать никакой графический интерфейс; более конкретно, не разрешается подключаться к серверу окон.
[...]
Агент - это процесс, который выполняется в фоновом режиме от имени определенного пользователя. Агенты полезны, потому что они могут делать то, что демоны не могут, например, надежно получать доступ к домашнему каталогу пользователя или подключаться к серверу окон.
LaunchControl сделал это безболезненным для меня в Йосемити. Он имеет приятный графический интерфейс перетаскивания, чтобы помочь вам создавать или редактировать сервисы. Было удивительно видеть все работающие службы, о которых я не знал.
меры
- Запустить LaunchControl
- Вверху слева смените GlobalDeamons и введите свой пароль администратора
- File->New
- Под ярлыком дайте ему уникальное имя. Соглашение "com.company.appname"
- В разделе "Программа" для запуска используйте сценарий оболочки Unix или любую команду, которую вы предпочитаете БЕЗ аргументов
- Если вашему приложению требуются аргументы, измените раскрывающееся поле с "Argv по умолчанию" на "Custom argv"
- Теперь укажите аргумент, который вы обычно используете, как если бы вы запускали его из фактической командной строки.
- Run at Load не является обязательным, вы решаете.
- С правой стороны перетащите StartInterval и установите нужный интервал. FAQ в меню Help очень хорош.