Я создаю веб-страницу, которая будет использоваться для мониторинга и контроля некоторых пользовательских программ на Си.Я создал страницу, которая будет запускать / останавливать 'программу запуска 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);
}
Любые предложения приветствуются!