Существует множество причин, по которым скрипт может завершиться преждевременно. Универсального решения не существует. Единственными ошибками, которые приводят к преждевременному завершению работы скрипта, являются фатальные ошибки - и в большинстве случаев функция выключения не запускается после фатальной ошибки, аналогично пользовательский обработчик ошибок будет надежно видеть только нефатальные ошибки. Тогда есть возможность настроить обработчики сигналов - но опять-таки они видят только часть истории.
Большой вопрос, конечно, что вы хотите сделать с этой информацией в функции выключения?
Единственный надежный способ определить, как логика завершена, как ожидалось, - поднять семафор, когда это происходит, и проверить его в функции выключения.