Com apple launchd что это

Launchd. Автозапуск программ при загрузке Mac OS X

В этот раз поговорим про автозапуск программ при загрузке Mac OS X. Статья рассчитана на продвинутых пользователей и тех кто стремится к этому уровню. В MacOS X имеется встроенное решение для выполнения автоматизации различных действий — Automator. Программа очень продвинутая в умелых руках, о которой можно писать целые книги, однако сегодня речь пойдет о другом.

Mac OS X, как и другие UNIX-подобные операционные системы, предоставляет просто потрясающие возможности по управлению процессами, демонами и запуском приложений по расписанию. К примеру, можно запустить собственный веб-сервер, выполнять скрипты или программы по расписанию, монтировать файловые системы и т.д. Применений на самом деле масса.

Не так давно, я писал про ограничение оборотов кулера на Mac, таким способом можно снизить шум на MacBook, Mac mini или iMac. Остался, правда, не раскрытым один достаточно важный вопрос, а именно, как автоматизировать запуск нашей утилиты, управляющей работой кулера? Согласитесь, не очень удобно всякий раз лезть в консоль и запускать её вручную. Так что, предлагаю на этом конкретном примере разобраться с Launchd и ознакомиться с сервисами и демонами в Mac OS X.

Services (сервисы) и Daemons (демоны) Mac OS X.

Для начала немного теории. «Сервисы» и «демоны» являются системными службами и обеспечивают работу системы, однако предназначены немного для разных целей, соответственно и работают тоже по-разному. Давайте разберемся, что конкретно делают эти «сервисы» и «демоны» и в чем разница между ними?

Начнем с того, что делают они практически всё, начиная с запуска WEB-сервера и заканчивая монтированием файловых систем и запуском графической оболочки. Разница же между ними в том, что «сервисы», как правило, запускаются после загрузки графического интерфейса и предназначены, в основном, для запуска графических приложений; «демоны» могут запускаться до загрузки графики, в фоновом режиме и предназначены запуска bash/shell скриптов, серверов (служб) и всевозможных консольных утилит.

Сервисы представляют из себя конфигурационные XML файлы с расширением .plist, которые во время загрузки Mac OS обрабатываются и запускаются фоновым процессом launchd. Файлы .plist находятся в директориях LaunchAgents или LaunchDaemons (в зависимости от их предназначения). В системе имеется несколько директорий LaunchAgents и LaunchDaemons. Это ключевой момент в понимании того как происходит работа системы и его стоит рассмотреть подробнее:

Все конфигурационные файлы, находящиеся в данной директории, выполняются при входе в систему (логине) КОНКРЕТНОГО пользователя (в каталоге которого они находятся) и с правами этого пользователя, не затрагивая при этом систему и других пользователей.

Системная директория. Все находящиеся в ней конфигурационные файлы исполняются при логине ЛЮБОГО пользователя с правами вошедшего пользователя.

Снова системная директория, но все конфиги исполняются от лица администратора (root) на уровне системы. Программа или сценарий будет исполнен вне зависимости от того, вошёл какой-либо пользователь в систему или нет. Это и есть нужный нам вариант.

Системная директория зарезервированная OS X. Все конфиги находящиеся в ней являются системными, запускаются при логине любого пользователя. Лучше сюда не лезть без нужды.

Системная директория зарезервированная OS X. Все конфиги, находящиеся в ней, являются системными и запускаются при загрузке системы с правами root. Сюда тоже не стоит лезть.

Как вы уже догадались, директории LaunchAgents используются для запуска «сервисов», а LaunchDaemons — для запуска «демонов».

Файлы конфигурации .plist

Как уже говорилось, все конфигурационные .plist-файлы запускаются фоновым процессом launchd во время загрузки OS X.

Сами по себе .plist-файлы всего лишь «сценарии», набор неких правил, для запуска других приложений и не являются самостоятельными программами, однако отличаются гибкостью и функциональностью в настройке. Пора рассмотреть пример, свой файл сценария я назвал my.fancontrol.plist:

Пока вообще ничего не понятно, ну это мы сейчас поправим. Напомню задачу — необходимо при запуске Mac OS X, до входа пользователя в систему (а то какая-то несправедливость получится) в терминале выполнить команду:

Тем самым мы запускаем утилиту smc и передаем ей два параметра — указываем кулер и выставляем ему максимальную частоту оборотов. Выше вы видите получившийся код нашего сценария со стандартной шапкой формата XML (для всех служб и демонов она одинакова).

Что я тут понаписал? Итак, основные ключи и параметры .plist-файла:

Ключ «Label» задаёт название сервиса, которое будет отображаться в Мониторинге системы или логах утилиты Консоль.

Ключ «ProgramArguments» содержит массив, в котором указаны путь к исполняемому файлу (или bash/shell скрипту) и параметры его запуска. Заметьте, что каждый параметр необходимо записывать отдельно.

Ключ «RunAtLoad» указывает системе, что правило нужно исполнить при загрузке ОС. Есть еще много всяких ключей и параметров, например для запуска приложения по расписанию или через определенные промежутки времени. Этой статьёй я даю лишь толчок для понимания дальнейшего изучения Launchd в OS X и не ставлю целью создать полноценное руководство.

файл создан. Осталось переместить его в папку-назначение (/Library/LaunchDaemons), поправить права доступа и атрибуты, и перезагрузиться. В терминале пишем:

Активировать или дезактивировать работающий сценарии можно выполнив команды:

Если считаете статью полезной,
не ленитесь ставить лайки и делиться с друзьями.

Комментариев: 5

Как исправить это:

«launchctl: no plist was returned for: /Library/LaunchDaemons/smc 21.06.14.plist

Читайте также:  Распиновка штекера для наушников айфон

nothing found to load»

Скорее всего дело в пробеле, который надо экранировать обратным слешем.

Доброго времени суток. Не могу понять как создать сам файл . plist. Не подскажите?

это обычный тестовый документ — создавать и править можно в любом текстовом редакторе. лично я предпочитаю Sublime Text

Хотелось бы реализовать нечто подобное для сценария создания RAM-диска при запуске ОС и перенести на него некоторые кеши. Не поможете решить эту задачу?

Источник

Запускаем программы при запуске Mac OS X — Launchd


Начнем с истории. Жили были десяток программ для запуска процессов или программ. И тысячи скриптов к ним. Dave Zarzycki из Apple решил написать программу, которая отличалась бы от выше написанных и предлагала бы единый, стандартизированный интерфейс к любым программам запускающим автоматически системой и другие вкусности.

Вот и вся история. Теперь к самой программе.

Называется она Launchd. И она с открытом исходным кодом. Опен сорс.
Все процессы при старте системы(в Mac OS X) запускаются одним процессом launchd. При загрузке launchd вызывается ядром как первый процесс и дальше вся система стартует с помощью него. Так же Launchd следит за тем чтобы процесс был запущен. Если он вдруг упадет, Launchd ему поможет и поднимет его.

Для начала решим для чего нам нужно запустить что-либо при загрузке и когда это надо сделать.
Если вам нужно чтобы программа или процесс запустился при запуске системы и даже когда пользователь не вошел, то следует создать файл в папке /Library/LaunchDaemons. Если же нужно только когда вы вошли в систему то в папке /Library/LaunchAgents. Так же можно использовать и другие директории, но в данной статье мы не будем их касаться.

Давайте создадим Daemon для запуска php-fcgi процессов.
sudo mate /Library/LaunchDaemons/com.php-fcgi
И так что же нам туда писать?
Сначала уясним что Property List это Xml файл. И он должен быть валидным. Иначе ничего не будет работать.
В Textmate есть проверка валидности этих файлов, так что никаких пробелем возникнуть не должно.

В этом файле должны содержаться 3 обязательных ключа.
Label — уникальный идентификатор.

ProgramArguments — По сути это путь и параметры запускаемой программы.
Первая строка всегда путь к программе если не используется ключ Program.
Последующие строки будут параметрами. Каждый параметр и его значение лучше писать в разные строки.

OnDemand — Этот ключ говорит Launchd перезапустить процесс если он не запустился или упал. Так же устновив значение false говорит о том, что мы хотим чтобы процесс был запущен всегда.

Теперь обернем это все в стандартную запись присутсвующую во всех файлах подобного типа.

Сохраним. Теперь Launchctl — это программа интерфейс для Launchd.
С помощью нее мы сможем включать или выключать загрузку нашего кофигурационного файла.
Например следующая команда включит наш файл.
sudo launchctl load -w /Library/LaunchDaemons/com.php-fcgi.plist
А эта выключит.
sudo launchctl unload -w /Library/LaunchDaemons/com.php-fcgi.plist
И добавит ключ с параметром в наш файл.

Вобщем теперь у нас при загрузке должно запускаться 5 процессов php-cgi. Перезапускать их можно командой
sudo launchctl stop php
а так как у нас стоит OnDemand false, то это просто перезапустит процесс.

Да чуть не забыл. Если вы хотите добавить переменные окружения, то надо написать примерно так

А теперь бонусы
Для многих копаться в командной строке лень или сложно. Для них есть вариант полегче. Это бесплатная программа Lingon.

Так же с помощью этой программы вы можете открыть com.apple.syslogd
и вместо /usr/sbin/syslogd написать /usr/sbin/syslogd -c 3 -a
Параметр -с 3 скажет игнорировать менее важные сообщения. И syslogd будет записывать только важные сообщения. Если хотите 0 это самые важные. 8 наименее.
Параметр -а скажет syslogd архивировать записи. И очищать активную базу записей каждые 24 часа.
Все это сделает немного быстрее ваш мак.

PS.
Когда я разбирался с launchd я столкнулся с небольшой проблемой. При старте вызывалась программа spawn-php (да я знаю что это было глупо) и она вызывала php-cgi процессы. При тестировании все было хорошо. Но при загрузке ничего не происходило. Только с десятого раза получалось запустить процессы. Не знаю с чем это было связано, может это проблема именно в spawn-php, но она решилась способом, который я описал выше, т.е. вызовом напрямую процесса.

Источник

Question: Q: com.apple.xpc.launchd & com.apple.mdworker.bundles pollute logs with errors

I made a clean install of Yosemite to MacBook Pro (13-inch, Early 2011), and restored documents and apps from TM backup, no problems so far, but I observe following repeating messages in system log and it concerns me, because apparently, launchd is trying to do something related to spotlight, but fails and this happens every 10 seconds.. I see no suspicious activity apart from too much CPU time spent on mds and mds_stores (but I guess it’s due to fresh install, hence Spotlight needs to index everything. ).

Any ideas where to dig?

21/10/2557 BE 2:11:43.811 PM com.apple.xpc.launchd[1]: (com.apple.mdworker.bundles[2654]) Could not find uid associated with service: 0: Undefined error: 0 502

21/10/2557 BE 2:11:43.835 PM com.apple.xpc.launchd[1]: (com.apple.mdworker.bundles) Service only ran for 0 seconds. Pushing respawn out by 10 seconds.

21/10/2557 BE 2:11:53.838 PM com.apple.xpc.launchd[1]: (com.apple.mdworker.bundles[2655]) Could not find uid associated with service: 0: Undefined error: 0 502

21/10/2557 BE 2:11:53.838 PM com.apple.xpc.launchd[1]: (com.apple.mdworker.bundles) Service only ran for 0 seconds. Pushing respawn out by 10 seconds.

Posted on Oct 21, 2014 12:44 AM

Читайте также:  Чем можно отполировать стекло айфона от царапин

Helpful answers

Yeah! I’ve found out what it is. I had the same identical annoying message spamming:

Oct 27 13:52:53 FlatMoon com.apple.xpc.launchd[1] (com.apple.mdworker.bundles): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.

Oct 27 13:53:03 FlatMoon com.apple.xpc.launchd[1] (com.apple.mdworker.bundles[1141]): Could not find uid associated with service: 0: Undefined error: 0 502

Just look at the last number; 502. It is the UID of another user. Which is present in my main partition (I have Lion and Yosemite installed in two partitions because it is an unsupported MacBook2,1. Sorry Apple, it works!! 😝).

So I just created a new user in my Yosemite partition (I may actually need it), which automatically gets UID 502 and the awful spamming disappeared! If you don’t have such user you may need to change the ownership of some incriminating files in Terminal with the command:

you may use the recursive option like in

I hope this helps. ^_^

Oct 27, 2014 6:38 AM

Alright, I seem to have solved it without having to create a new user, (but thanks to @Michelasso for the tip!).

I started doing some investigation and found that there were some temp files for mdworker that were in a user 502 folder:

cd /private/var/folders

sudo find . | grep mdworkers

The above command will show you which temp directories have your com.apple.mdworker.bundle file. Mine looked something like this:

I then changed my directory into each folder and did and ls -l and found that in one the whole temp folder belonged to user 502

cd y8

ls -l

drwxr-xr-x 6 502 staff 204 July 27 11:04 zdsf987dsf987sdfsd_s977cd_6kg97gs

I also noted it was old.

So I removed that whole cache:

cd /private/var/folders

sudo rm -rf y8

I then had to restart (because my mac was locked in the respawn loop) and I have put her to sleep and woken her and so far all seems well.

For some reason launchd appears to be trying to spawn from old cache data.

Anyway, please test it out and see if it solves your problem.

Oct 27, 2014 11:37 AM

There’s more to the conversation

Loading page content

Page content loaded

I am having this trouble too, it seems to be related to a decrease in performance with Yosemite as well, the process is trying to respawn multiple times a second.

I am troubleshooting this, as it happened in the beta as well. It seemed that rebuilding permissions and restarting helped last time. I’ll let you know if I figure it out.

Oct 24, 2014 8:44 PM

After using Disk Utility to rebuild permissions, I restarted. I had to force quit my Macbook Pro (By holding the power button to force the shutdown) after it seemed get stuck shutting down.

After restarting, I canceled the dialog asking me if I wanted to reopen my applications because my computer shutdown because of a problem. And now all seems to be well. No more mdworker message in the logs and mdworker seems to be running (and apparently indexing the drive).

TL;DR I would recommend that you follow this procedure, it helped me:

  1. Use Disk Utility to rebuild your disk permissions.
  2. Save your work and quit your apps.
  3. Restart your Mac. (Force quit if you are still waiting after a couple of minutes)
  4. If after the restart Yosemite asks you if you want to reopen your Applications, «Cancel» to prevent your apps from reloading.
  5. All should be running normally.

Oct 24, 2014 9:09 PM

Interesting idea, thanks for your input!

It did not work for me however. Disk Utility repaired permissions mostly in /printers/.. folders (which I never use anyway), and after quitting all apps and reboot, system log was clear for a while, but once mdworker came back to life, same mess started again.. At least in my case it’s every 10 seconds, not as bad as several times a second.

Oct 25, 2014 2:31 AM

I get the same, but it only starts afer opening SmartReporter app, not before but continues after I close the app. Only rebooting stops it. I don’t get it as long as I don’t use the SmartReporter app.

Oct 26, 2014 2:58 PM

I never had Smartreporter installed, so it’s unrelated in my case. Log messages start 5-10 mins after reboot, maybe some other app in my case induces them, but there is nothing special really on this Macbook, apart from Chrome and VLC.

Oct 26, 2014 7:53 PM

It started for me yesterday without using SmartReporter, which appears only to trigger it than cause it. Is there a command or something to disable this or turn the messages off, or better yet, a solution to what’s causing these messages?

Oct 27, 2014 5:59 AM

Yeah! I’ve found out what it is. I had the same identical annoying message spamming:

Oct 27 13:52:53 FlatMoon com.apple.xpc.launchd[1] (com.apple.mdworker.bundles): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.

Oct 27 13:53:03 FlatMoon com.apple.xpc.launchd[1] (com.apple.mdworker.bundles[1141]): Could not find uid associated with service: 0: Undefined error: 0 502

Just look at the last number; 502. It is the UID of another user. Which is present in my main partition (I have Lion and Yosemite installed in two partitions because it is an unsupported MacBook2,1. Sorry Apple, it works!! 😝).

Читайте также:  Apple time capsule a1409 замена диска

So I just created a new user in my Yosemite partition (I may actually need it), which automatically gets UID 502 and the awful spamming disappeared! If you don’t have such user you may need to change the ownership of some incriminating files in Terminal with the command:

you may use the recursive option like in

I hope this helps. ^_^

Oct 27, 2014 6:38 AM

Great, I meant to come back here and say that the solution above didn’t keep. For me, it always happens when my machine is waking up. I am trying to figure out what is asking it to run for user 502 so that I can fix it without creating another user. 😀

But that is great feedback. I’ll see if I can figure it out, for me a restart fixes the problem until my machine goes to sleep, upon waking the error starts.

Oct 27, 2014 10:25 AM

Alright, I seem to have solved it without having to create a new user, (but thanks to @Michelasso for the tip!).

I started doing some investigation and found that there were some temp files for mdworker that were in a user 502 folder:

cd /private/var/folders

sudo find . | grep mdworkers

The above command will show you which temp directories have your com.apple.mdworker.bundle file. Mine looked something like this:

I then changed my directory into each folder and did and ls -l and found that in one the whole temp folder belonged to user 502

cd y8

ls -l

drwxr-xr-x 6 502 staff 204 July 27 11:04 zdsf987dsf987sdfsd_s977cd_6kg97gs

I also noted it was old.

So I removed that whole cache:

cd /private/var/folders

sudo rm -rf y8

I then had to restart (because my mac was locked in the respawn loop) and I have put her to sleep and woken her and so far all seems well.

For some reason launchd appears to be trying to spawn from old cache data.

Anyway, please test it out and see if it solves your problem.

Oct 27, 2014 11:37 AM

I see, Dustmoo.. I thought the issue was caused by having that account with UID 502 in my main partition. So I dug it a bit more using your example. I actually couldn’t find any mdworkers directory in /var. So I looked for the files owned by UID 502 (but it could be any other UID. One must check the last number in the error message, the one I underlined in my first post and use it instead of 502 in the following code):

cd /var

sudo find . -user 502 -exec ls -ld <> \;

This has been the output:

drwx—— 5 michele _spotlight 170 Oct 16 19:10 ./folders/zz/zyxvpxvq6csfxvn_n0000000000000/0/com.apple.Spotlight/502

drwx—— 2 michele _spotlight 68 Oct 16 19:10 ./folders/zz/zyxvpxvq6csfxvn_n0000000000000/0/com.apple.Spotlight/502/0

drwx—— 2 michele _spotlight 68 Oct 16 19:10 ./folders/zz/zyxvpxvq6csfxvn_n0000000000000/0/com.apple.Spotlight/502/C

drwx—— 2 michele _spotlight 68 Oct 16 19:10 ./folders/zz/zyxvpxvq6csfxvn_n0000000000000/0/com.apple.Spotlight/502/T

(michele is my username for UID 502)

So it was still in the /var/folder directory, but something related to or created by Spotlight one week ago. Not sure how it went there, since this was a fresh installation in that partition. It really looks like junk to me.

Just in case I removed the incriminated directory:

cd /private/var/folders/zz/

# I did some directory listing and other things just to check

sudo rm -r zyxvpxvq6csfxvn_n0000000000000

And rebooted. I can’t really say if it changed anything because I had already made the new account, but it does look like the culprit.

Oct 27, 2014 3:58 PM

Intersting, I had the numbers 504 and 1104188992./

Followed your suggestion for 504. Reboot safe boot, then normal.

Got the following errors

Oct 27 21:24:55 [name deleted]-2.local mdworker[582]: code validation failed in the process of getting signing information: Error Domain=NSOSStatusErrorDomain Code=-67062 «The operation couldn’t be completed. (OSStatus error -67062.)»

Oct 27 21:24:55 [name deleted]-.local mdworker[581]: code validation failed in the process of getting signing information: Error Domain=NSOSStatusErrorDomain Code=-67062 «The operation couldn’t be completed. (OSStatus error -67062.)»

Oct 27 21:25:46 [name deleted]-.local mdworker[866]: code validation failed in the process of getting signing information: Error Domain=NSOSStatusErrorDomain Code=-67062 «The operation couldn’t be completed. (OSStatus error -67062.)»

Oct 27 21:25:46 [name deleted]-.local mdworker[867]: code validation failed in the process of getting signing information: Error Domain=NSOSStatusErrorDomain Code=-67062 «The operation couldn’t be completed. (OSStatus error -67062.)»

Oct 27 21:27:12 [name deleted]-.local mdworker[885]: code validation failed in the process of getting signing information: Error Domain=NSOSStatusErrorDomain Code=-67062 «The operation couldn’t be completed. (OSStatus error -67062.)»

Oct 27 21:27:12 [name deleted]-.local mdworker[884]: code validation failed in the process of getting signing information: Error Domain=NSOSStatusErrorDomain Code=-67062 «The operation couldn’t be completed. (OSStatus error -67062.)»

Oct 27 21:30:32 [name deleted]-.local mdworker[1094]: code validation failed in the process of getting signing information: Error Domain=NSOSStatusErrorDomain Code=-67062 «The operation couldn’t be completed. (OSStatus error -67062.)»

Oct 27 21:30:32 [name deleted]-.local mdworker[1095]: code validation failed in the process of getting signing information: Error Domain=NSOSStatusErrorDomain Code=-67062 «The operation couldn’t be completed. (OSStatus error -67062.)»

Источник

Оцените статью