launchdзапускает Daemons ( /Library/LaunchDaemonsили /System/Library/LaunchDaemons) от имени пользователя root и запускает их независимо от того, вошли пользователи или нет. Агенты запуска ( /Library/LaunchAgents/или ~/Library/LaunchAgents/) запускаются, когда пользователь вошел в систему как этот пользователь. Вы не можете использовать setuid для смены пользователя, запускающего скрипт на демонах. /SystemКаталог зарезервирован для Mac OS X задач , поэтому я рекомендую положить ваш launchdplists в либо /Libraryили ~/Libraryпапку , как это имеет смысл.
Итак, первый шаг - определить, делаете ли вы агент или демон.
Второй шаг - создать .plistфайл. Вы можете использовать программы на основе графического интерфейса, такие как Lingon, чтобы помочь с этим или просто использовать ваш любимый текстовый редактор:
Пример .plistдля запуска скрипта каждый час ( StartIntervalили StartIntervalCalendarэто ключи, которые мы хотим - StartIntervalчтобы элемент происходил каждые xсекунды, StartIntervalCalendarв течение определенного времени и / или даты. См. 126907 для SuperUser для примера, который я сделал с StartCalendarInterval):
<?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>local.IDENTIFIER_HERE.SOMETHING</string>
<key>OnDemand</key>
<true/>
<key>RunAtLoad</key>
<false/>
<key>UserName</key>
<string>USERNAME HERE</string>
<key>Program</key>
<string>/PATH/TO/SCRIPT</string>
<key>ProgramArguments</key>
<array>
<string>Argument_1</string>
<string>Argument_2</string>
</array>
<key>StartInterval</key>
<integer>3600</integer>
</dict>
</plist>
Измените, .plistесли необходимо, указать свой сценарий и все необходимые аргументы (аргументы указаны в отдельных строках) и сохраните файл с тем же именем, что и значение Label, но .plistв конце с. (например, local.my-mac.flickrstatsбудет сохранен как local.my-mac.flickrstats.plist). Если вы еще этого не сделали, переместите этот .plistфайл во /Library/LaunchDaemonsвремя создания демона (выполняется постоянно) или в ~/Library/LaunchAgents(только если вы вошли в систему) или /Library/LaunchAgents(любой пользователь вошел в систему).
Для запуска задания, которое вы хотите запустить, launchctlнеобходимо загрузить файл. Для элементов в /Library, вы должны использовать sudo: например,sudo launchctl load -w /PATH/TO/PLIST
Для справки также ознакомьтесь со следующими вопросами о суперпользователе : команда Launchd от имени пользователя root , загрузка системного демона и как заставить скрипт запускаться каждый день