Использовать launchd
и укажите следующее в конфигурации своего LaunchDaemon/LaunchAgent:
<key>KeepAlive</key>
<true/>
Этот дополнительный ключ используется, чтобы управлять, нужно ли Вашей работе хранить верность, непрерывно работая или позволять спросу и условиям управлять вызовом. Значение по умолчанию является ложью, и поэтому только потребуйте, запустит задание. Значение может иметь значение true для безусловного поддержания задания. [...]
Для перезапуска я полагаю, что Вы можете просто kill
это и это возвратятся автоматически.