Как использовать Launchd для планирования выполнения скриптов на Mac

Автоматизация задач с помощью планирования скриптов — это мощная возможность, на которую полагаются многие администраторы каждый день. Обычные пользователи Mac также могут воспользоваться этой силой, используя launchd, предпочтительный инструмент Apple для автоматизации и управления задачами в macOS. От планирования простых задач, таких как отключение Wi-Fi в определенное время, до выполнения сложных резервных копий системы, launchd на Mac может помочь вам автоматизировать ваши рабочие процессы, сэкономить время и обеспечить работу вашей системы именно так, как вам нравится.
Содержание
- Что такое Launchd?
- Демоны и агенты
- Написание скриптов
- Описания заданий
- Загрузка заданий в launchctl
- Часто задаваемые вопросы
Что такое Launchd?
Точно так же, как оркестру нужен дирижер для управления и гармонизации разнообразных инструментов, macOS Ventura, с ее множеством процессов и служб, полагается на launchd, чтобы обеспечить идеальное взаимодействие. Поскольку это первый процесс, запускаемый ядром macOS при загрузке вашего компьютера, launchd занимает центральное место, оркеструя каждый последующий процесс, службу и приложение, как дирижер, сигнализирующий о начале симфонии с первым взмахом палочки.
Помимо своей роли в оркестрации системы, launchd может использоваться для планирования скриптов, серии команд, написанных для выполнения конкретной задачи. Это делается с помощью команды launchctl, которая служит интерфейсом для пользователей, чтобы общаться и управлять дирижером, которым является launchd.
Полезно знать: скачиваете торренты? Повышайте эффективность, скачивая торренты с помощью Терминала на вашем Mac.
Демоны и агенты
launchd иногда называют демоном, компьютерной программой, которая работает как фоновый процесс и обычно не предназначена для прямого управления пользователем. Что касается демонов, то launchd особенный, так как он является маэстро всех других демонов macOS и может решать, когда они запускаются и останавливаются. Эти подчиненные демоны работают от имени пользователя root, поэтому они могут делать практически все.

Однако, как пользователь, заинтересованный в планировании задач, запуск скриптов от имени пользователя root не всегда желателен или необходим. Здесь на помощь приходят агенты. Агенты работают от имени вошедшего в систему пользователя, предлагая более ограниченную среду и обеспечивая выполнение скриптов или задач с правами и предпочтениями этого конкретного пользователя. Например, если вы хотите, чтобы скрипт выполнял изменения настроек или получал доступ к файлам в вашей учетной записи, вам следует использовать агента.
Совет: сталкиваетесь с проблемами совместимости с некоторыми из ваших любимых старых приложений для Mac? Узнайте, как установить 32-битный Linux на старый Mac.
Написание скриптов
Чтобы запускать агентов или демонов через launchd, вам нужно будет написать несколько скриптов. Наиболее распространенным языком сценариев является bash. Если вы хотите узнать больше о написании скриптов на bash, вы можете ознакомиться с нашим руководством для начинающих по написанию скриптов на bash.

Ваши скрипты launchd могут находиться в двух разных местах, в зависимости от того, предназначены ли они для запуска в качестве агентов или демонов:
- Для тех скриптов, которые предназначены для работы в качестве агентов, действующих от имени вошедшего в систему пользователя, они должны храниться в “~/Library/LaunchAgents.”
- Напротив, скрипты, предназначенные для работы в качестве демонов, действующих на уровне всей системы независимо от вошедшего в систему пользователя, должны находиться в “/Library/LaunchDaemons.”
Помните, агенты не имеют прав root, поэтому они не могут выполнять задачи, требующие глубокого доступа к системе. Демоны, с другой стороны, работают с правами root и могут выполнять задачи, которые влияют на всю систему.
Полезно знать: вы можете получить более глубокий контроль над вашим Mac, включив пользователя root, что позволит вам получить доступ ко всей файловой системе.
Описания заданий

Скрипты в launchd запускаются по определению задания, которое представляет собой файлы .plist, хранящиеся в определенных каталогах. Эти XML-файлы дают заданию имя, указывают скрипт, который должен быть запущен, и указывают, когда скрипт должен быть выполнен. После того как вы написали свой скрипт, вам нужно будет написать и загрузить определение задания, которое запускает скрипт в нужное время. Определение задания выглядит примерно так:
version="1.0"encoding="UTF-8"?>
version="1.0">
>
>Label>
>local.restart>
>Program>
>/Users/user/Scripts/restart.sh>
>RunAtLoad>
/>
>
>Измените по мере необходимости, затем поместите это в текстовый файл с расширением .plist перед тем, как поместить его в правильный каталог (см. выше).
Есть несколько ключевых частей в описании задания:
- Label: имя задания в launchd. Должно быть уникальным для каждого задания. Они записываются в обратной доменной нотации, и “local” — отличная доменная зона для частных агентов.
- Program: полный путь к скрипту, который запускает это описание задания.
- RunAtLoad: описывает, когда скрипт должен быть запущен. Здесь есть несколько различных опций: - RunAtLoad: запуск сразу после загрузки определения задания. Запускается только один раз за загрузку.
- StartInterval: запуск задания каждые n секунд.
- StartCalendarInterval: запуск задания в определенное время и дату.
Совет: нужно больше места для этих файлов скриптов? Узнайте, как очистить кэш на вашем Mac, чтобы быстро освободить место.
Загрузка заданий в launchctl

После того как вы создали свои скрипты и сохранили своего агента в правильном месте, вам нужно будет загрузить его в launchctl. Это произойдет автоматически при будущих входах в систему.
Чтобы увидеть, что в данный момент работает в launchctl, вы можете использовать launchctl list в терминале. Этот огромный список можно отфильтровать для вашего скрипта, пометив его чем-то вроде следующего:
launchctl list |grep local.restartЧтобы загрузить скрипт, откройте Терминал и используйте следующую команду:
launchctl load ~/Library/LaunchAgents/local.restart.plistЧтобы удалить скрипт из очереди launchctl, используйте команду unload:
launchctl unload ~/Library/LaunchAgents/local.restart.plistЗагрузка задания помещает его в очередь launchd, и задание будет выполнено в указанное время в его условиях запуска. Если вы хотите запустить скрипт немедленно, независимо от всего, вам следует использовать команду “start”:
launchctl start local.restartЭта команда принимает метку задания и будет работать только если задание уже было загружено в launchctl.
Совет: станьте продвинутым пользователем Mac, используя Raycast или Alfred для быстрого запуска ваших любимых приложений.
Часто задаваемые вопросы
Как я могу проверить, запустил ли launchd скрипт?
Вы можете использовать команду launchctl list в терминале. Это отобразит все загруженные задания. Чтобы найти конкретный скрипт или задание, используйте grep, например, launchctl list | grep your_script_name.
Что если launchd использует слишком много системных ресурсов?
Если launchd потребляет чрезмерные ресурсы, это обычно связано с неправильно работающим скриптом или заданием. Вам следует просмотреть скрипты, которые вы добавили недавно, и выгрузить их, используя launchctl unload /path/to/job.plist.
В чем разница между cron и launchd?
Оба cron и launchd являются службами планирования, но они работают по-разному. cron — это более старая система планирования заданий на основе Unix, которая запускает задания в фиксированные времена или интервалы, определенные в файле crontab. launchd — это новая система Apple для macOS, которая может запускать задания на основе различных триггеров — не только времени.
Могу ли я использовать другие языки сценариев, кроме bash, с launchd?
launchd может выполнять любой скрипт, который можно запустить из терминала. Это включает скрипты, написанные на Python, Perl, Ruby и других языках.
Кредит изображения: Pexels. Все скриншоты сделаны Дэвидом Морео.