Почему эта программа не получила SIGTERM при инициализации /перезагрузке /завершении работы?

Мне нужно перехватить перезагрузку или выключение. Программа выглядит следующим образом:

void sig_handler(int sig) {
    if (sig == SIGTERM) {
        /* do something */
    }
}

int main() {
    ....
    signal(SIGTERM, sig_handler);

    /* daemon */
    pid = fork();
    if (pid > 0) exit(EXIT_SUCCESS);
    // I didn't do setsid() to retain process group id.
    ....
}

Это работает, когда я проверил 'kill -15'. Однако, когда я попробовал команду «перезагрузить» или «выключить», он не получил сигнал. Страница руководства init гласит:

"Когда init запрашивается изменение уровня выполнения, он отправляет предупреждающий сигнал SIGTERM всем процессам, которые не определены в новом уровне выполнения. Затем он ждет 5 секунд, прежде чем принудительно завершить эти процессы с помощью сигнала SIGKILL. Обратите внимание, что init предполагает, что все эти процессы (и их потомки) остаются в той же группе процессов, которую изначально создал для них init. Если какой-либо процесс изменит свою принадлежность к группе процессов, он не получит эти сигналы. Такие процессы должны быть завершены отдельно ».

Как настроить init init для отправки SIGTERM в эту программу? Я полагаю, мне нужно установить идентификатор группы процессов на то, что знает init, но как я могу это сделать?

4 голоса | спросил duyt 22 AMpFri, 22 Apr 2011 01:19:19 +040019Friday 2011, 01:19:19

1 ответ


0

Если ваша программа не запускается системой инициализации, она не будет управляться системой инициализации. Запустите его из сценария init.d, чтобы получить описанные преимущества.

ответил bmargulies 22 AMpFri, 22 Apr 2011 01:23:07 +040023Friday 2011, 01:23:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132