Практический ответ, чтобы сделать то, что вы изначально хотели, состоит в том, что вы проверяете процесс завершения работы (например, ps aux | grep "shutdown -h"), а затем, если хотите быть уверенным, проверяете его аргументы командной строки и определяете время был запущен (например, «shutdown -h +240», запущенный в 14:51, завершит работу в 18:51).
В общем случае с точки зрения всей системы нет способа сделать это. Есть много разных способов «выключения». Например, кто-то может решить отключить штепсельную вилку, чтобы жестко остановить программу, которая сейчас имеет плохое / опасное поведение во время выключения, или ИБП может сначала отправить SIGHUP, а затем просто дать сбой. Поскольку такое отключение может произойти внезапно и без предупреждения нигде в системе, невозможно быть уверенным, что после SIGHUP можно продолжать работу.
Если процесс получает SIGHUP, вы должны предположить, что в скором времени последует что-то более неприятное. Если вы хотите сделать что-то особенное и частично игнорировать SIGHUP, то а) вам нужно согласовать это с любой программой, которая выполнит выключение, и б) вы должны быть готовы к тому, что, если какая-то другая система завершит работу и убьет вас мертвыми вскоре после SIGHUP Ваше программное обеспечение и данные выживут. Запишите все имеющиеся у вас данные и продолжайте записывать только в файлы только для добавления с безопасными атомарными обновлениями.
В вашем случае я почти уверен, что ваше текущее решение (рассматривайте все SIGHUP как остановку) - правильный путь. Если вы хотите что-то улучшить, вам, вероятно, следует добавить в программу завершения работы функцию, которая делает уведомление через DBUS или что-то подобное.