Использование PHP posix_kill () в Linux вызывает странное поведение - PullRequest
4 голосов
/ 17 января 2012

Я создаю веб-страницу, которая будет использоваться для мониторинга и контроля некоторых пользовательских программ на Си.Я создал страницу, которая будет запускать / останавливать 'программу запуска C' (хорошее общее имя), которая затем разветвляется и создает несколько дочерних процессов.Пуск работает нормально - exec("cd launcher_dir; nohup ./launcher > outfile 2>&1 &");

Остановка - это проблема.После нажатия кнопки «Стоп» одна из двух вещей происходит случайно.Либо есть страница с ошибкой браузера (101 Сброс соединения или 324 Пустой ответ), либо страница загружается дважды, но вы видите ее только во второй раз.Причина, по которой я знаю, что он загружается дважды, заключается в отладке сообщений в коде.В обоих случаях процесс запуска убивается (отправляется SIGTERM).Но если страница загружается дважды, то в первый раз она убивает модуль запуска (на этой странице ничего не загружается), а во второй раз проверяет и обнаруживает, что ни один процесс запуска не запущен, и отображает сообщение: «Модуль запуска не запущен».

Я записываю сообщения отладки в файл и обнаружил, что перезагрузка происходит в несколько переменной строке в коде php (иногда определенное сообщение отладки печатается, а иногда нет). Кроме того, ошибка phpдля отчетов установлено значение ВСЕ, и ошибок не выдается.

Программа запуска перехватывает SIGTERM, по очереди отправляет SIGTERM дочерним процессам, а затем вызывает exit (0).

Интересно, что если SIGKILL используется для уничтожения программы запуска, php работает нормально и, как и ожидалось, однако это не позволяет корректно завершить работу программы запуска.Что здесь может происходить?

Вот соответствующий код php:

function stop_launcher(){
    $pid = get_launcher_pid(); // Definitely returns the correct pid
    debug_message("stop_launcher called, pid = ".$pid);
    if ($pid == "") {
        // If no 'connection reset' error occurs this is displayed
        // after first executing the else branch. Why is the php being run twice?
        print "Launcher doesn't seem to be running.. <br />";
        exit;
    } else {
        debug_message("killing");
        posix_kill(intval($pid), 15); //SIGTERM
        debug_message("kill finished"); // Sometimes this message is written, sometimes                      not
        if (ps_exists($pid)) { // Definitely works. This never gets displayed
            print "Shutdown failed. Try again</br>";
            exit;
        } 
    }
}

function debug_message($message){
    $fh = fopen(".debug", 'a') or die("can't open file");
    fwrite($fh, date("-r").":  ".$message."\n");
    fclose($fh);
}

Любые предложения приветствуются!

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012

Оказывается, это была одна из тех ошибок, которая заставляет вас чувствовать себя глупо!Программа запуска случайно убила свою группу процессов ...

0 голосов
/ 17 января 2012

Launcher это оболочка. Некоторые снаряды отправляют SIGTERM своим детям, если они получают SIGTERM. Изменение «nohup» на «exec nohup» должно избавить от проблемы.

...