Когда-то задавался схожим вопросом, но никакого железного решения для всех дистрибутивов не нашел. Сделал через DBus и меня устроило:
Подписываемся
QDBusConnection::systemBus().connect("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", "Sleeping", this, SIGNAL(SystemIsGoingToSuspend()));
QDBusConnection::systemBus().connect("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", "Resuming", this, SIGNAL(SystemIsGoingToResume()));
Отписываемся:
QDBusConnection::systemBus().disconnect("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", "Sleeping", this, SIGNAL(SystemIsGoingToSuspend()));
QDBusConnection::systemBus().disconnect("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", "Resuming", this, SIGNAL(SystemIsGoingToResume()));
Код использует Qt, но, я думаю, суть должна быть ясна. По наступлении определенного события будет вызван метод SystemIsGoingToSuspend/SystemIsGoingToResume