AFAIK, вы можете просто разветвляться и исполняться. Вот критическая точка: «Вы не должны разветвлять свой процесс и иметь выход родительского процесса.» Дело в том, что launchd «следит» за вашим сервисом. Если ваш сервис завершается, он перезапускается. Это означает, что он также не может демонизироваться (под daemonize я имею в виду классический , порождающий новый процесс, создающий новую группу процессов, выход из родительского процесса, подпроцесс живет по схеме ).
Полагаю, вам следует обязательно убить / выйти из подпроцессов перед выходом из основного процесса, чтобы не засорять среду.