Как я поставил задачу для выполнения время от времени?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

72
задан gsamaras 26 July 2016 в 16:07
поделиться

6 ответов

Просто используйте launchd. Это - очень мощная система средства запуска, и между тем это - стандартная система средства запуска для Mac OS X (текущая версия OS X даже не загрузилась бы без него). Для тех, кто не знаком с launchd (или с OS X в целом), он похож на гибрид между init, cron, at, SysVinit (init.d), inetd, upstart и systemd. При заимствовании понятия всех этих проектов все же также предложении вещей Вы не можете найти в другом месте.

Каждый сервис/задача является файлом. Местоположение файла зависит от вопросов: "Когда эта услуга, как предполагается, работает?" и, "В котором будут нужны полномочия сервис?"

Системные задачи переходят в [1 132]

/Library/LaunchDaemons/

, если они должны работать, неважно, если в какого-либо пользователя войдут система или нет. Они будут запущены с "корневых" полномочий.

, Если они должны только работать, если какой-либо пользователь будет зарегистрирован, они переходят в [1 134]

/Library/LaunchAgents/

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

, Если они должны работать, только если Вы зарегистрированы, они переходят в [1 136]

~/Library/LaunchAgents/

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

Примечание, которое там также существует /System/Library/LaunchDaemons и /System/Library/LaunchAgents, но как обычно, всем под [1 116] управляет OS X. Вы не должны помещать файлы туда, Вы не должны изменять файлы там, если Вы действительно не будете знать то, что Вы делаете. Бездельничание в папке Systems может сделать Вашу систему неприменимой (получите его в состояние, где это даже откажется загружаться снова). Это каталоги, куда Apple помещает launchd задачи, которые будят Вашу систему и работающий во время начальной загрузки, автоматически запускают сервисы как требуется, выполняют задачи обслуживания системы и так далее.

Каждый launchd задачей там является файл в формате plist. Это должно иметь обратную нотацию доменного имени. Например, можно назвать задачу

com.example.my-fancy-task.plist

, Этот plist может иметь различные варианты и настройки. Запись один на руку является субоптимальной, можно хотеть заставить бесплатный инструмент Lingon создавать задачи. Этот инструмент раньше был свободен, теперь он стоит 5$ в App Store, и 10$ как не версия App Store (не версия App Store намного более мощна и если Вы уже планируете оплату его, серьезно, получаете не версию App Store). Если кто-либо знает сопоставимый инструмент, который является бесплатным программным обеспечением или открытым исходным кодом, напишите мне в комментариях, и я скорее рекомендую, что один (не хотят рекламировать здесь для коммерческого программного обеспечения).

Так же, как пример, это могло быть похожим на это

<?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>com.example.my-fancy-task</string>
    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/usr/local/bin/my-script.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>1800</integer>
</dict>
</plist>

, Этот агент будет выполнять сценарий оболочки/usr/local/bin/my-script.sh каждые 1800 секунд (каждые 30 минут). Можно было также работать на задаче определенные даты/времена (в основном launchd, может сделать все, что крон может сделать), или можно даже отключить "OnDemand" порождение launchd для хранения постоянно рабочего процесса (если это выйдет или откажет, то launchd сразу перезапустит его). Можно даже ограничить, сколько ресурсов может использовать процесс (как сказано прежде, Lingon показывает все эти настройки в хорошем интерфейсе UI).

Обновление: Даже при том, что OnDemand все еще поддерживается, это удерживается от использования. Новую установку называют KeepAlive, который имеет намного больше смысла. Это может иметь булево значение, в этом случае это - полная противоположность [1 121] (установка, это к [1 122] ведет себя, как будто OnDemand true и наоборот). Большая новая возможность, что она может также иметь значение словаря вместо булева. Если это имеет значение словаря, у Вас есть несколько дополнительных опций, которые дают Вам больше мелкозернистого контроля, под которым обстоятельствами должна быть поддержана задача. Например, это только поддерживается пока программа, завершенная с кодом выхода нуля, только, пока определенный файл/каталог на диске существует, только если другая задача также жива, или только если сеть в настоящее время.

Также можно вручную позволить/запретить задачи через командную строку:

launchctl <command> <parameter>

команда может быть загрузкой или разгрузиться, чтобы загрузить plist или разгрузить ее снова, в этом случае параметр является путем к файлу. Или команда может быть запуском или остановкой, чтобы только запустить или остановить такую задачу, в этом случае параметр является маркировкой (com.example.my-fancy-task). Другие команды и опции существуют также.

Видят документацию Apple plist формат , и launchctl инструмент командной строки (обратите внимание, что можно выбрать версию OS X на вершине, так как формат/опции действительно варьируется между различными выпусками OS X)

115
ответ дан Mecki 24 November 2019 в 12:33
поделиться

На MacOSX у Вас есть, по крайней мере, следующие опции:

  • Повторяющееся предупреждение iCal с "Выполненным Сценарием" действие
  • крон launchd
  • ( link1, link2)

От личного опыта, крон является самым надежным. Когда я протестировал, launchd имел много ошибок и причуд. iCal предупреждает только выполненный, когда Вы зарегистрированы (но это могло бы быть чем-то, что Вы предпочитаете).

11
ответ дан Bruno De Fraine 24 November 2019 в 12:33
поделиться

Как Mecki, на который указывают, launchd был бы способом пойти с этим. Существует графический интерфейс для launchd, названного Lingon, который Вы могли бы хотеть проверить, в противоположность редактированию launchd файлов вручную:

Lingon является графическим интерфейсом пользователя для создания редактирования launchd конфигурационные файлы для Mac OS X Leopard 10.5.

[надрез...]

Редактирование конфигурационного файла легче чем когда-либо в этой версии, и это имеет два различных режима. Основной Режим, который имеет наиболее распространенные настройки, легко доступные в очень простом интерфейсном и Опытном Режиме, где можно добавить все настройки или непосредственно в тексте или вставить их через меню.

6
ответ дан Matt 24 November 2019 в 12:33
поделиться

Для сценариев яблока я настроил специальный календарь iCal и предупреждения использования для выполнения их периодически. Для инструментов командной строки я использую launchd.

2
ответ дан Mike Heinz 24 November 2019 в 12:33
поделиться

Можно использовать крон для планирования задач.

crontab -e

задание А определяется в следующем формате.

* * * * *  command to execute
│ │ │ │ │
│ │ │ │ └─── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
│ │ │ └──────── month (1 - 12)
│ │ └───────────── day of month (1 - 31)
│ └────────────────── hour (0 - 23)
└─────────────────────── min (0 - 59)

Пример:

0 12 * * *  cd ~/backupfolder && ./backup.sh

, Как только Вы установили свои задачи крона, можно использовать crontab-l для списка задач.

crontab -l

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

https://crontab.guru https://ole.michelsen.dk/blog/schedule-jobs-with-crontab-on-mac-osx.html

0
ответ дан 24 November 2019 в 12:33
поделиться

К вашему сведению: хотя я очень скучаю по его функциональности, cron ушел в прошлое в OS X. Он был сторожевым псом на пантере. Начиная с Tiger он был запущен. Поэтому, если вы используете Leopard cron, это не вариант.

1
ответ дан 24 November 2019 в 12:33
поделиться
Другие вопросы по тегам:

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