Я вызываю некоторые внутренние скрипты PHP на веб-сервере Apache, которые запрограммированы на работу в течение нескольких дней. Проблема в том, что я не могу найти способ остановить эти скрипты (кроме перезапуска сервера с помощью sudo apachectl restart).
Обычно я бегал ps -aux | grep script_name
получить PID и убить его.
Но в этом случае, когда я делаю это с помощью PHP ( shell_exec("ps -aux | grep script_name")
Я не вижу процесса .. моя гипотеза заключается в том, что при вызове скриптов через apache он запускает их внутри, поэтому они не видны.
Есть идеи, как проверить, какие скрипты запущены, и прервать их при необходимости?
Запускать вещи, которые требуют времени в рамках веб-запроса, просто неправильно - даже в 2020 году с http / 2.
Можно достичь результата идентификации и завершения соответствующего процесса из командной строки (подсказка mod_status), но это проблема XY.
Видеть - https://stackoverflow.com/questions/2212635/best-way-to-manage-long-running-php-script
Хорошо, из информации, которую я получил из ваших комментариев, я думаю, что вы используете mod_php
модуль apache для включения скриптов php. Это также объясняет, почему вам нужно перезапустить apache, который с точки зрения убивает все потоки, включая бегунов php.
Поскольку php работает как поток в вашем apache, у вас не будет шансов использовать kill или тому подобное, потому что парсер php не разветвляется или вообще не является отдельным процессом.
Самое чистое решение (с моей точки зрения) - это регулярно проверять, установлен ли флаг. Я предполагаю, что ваш скрипт выполняет некоторые тяжелые вычислительные операции, которые вызывают задержку. Вы можете разделить вычислительные усилия на более мелкие части. Если задержки возникают из-за вещей, связанных с вводом-выводом, вам может потребоваться разделить это или установить тайм-ауты.
Затем вы регулярно проверяете, установлен ли определенный флаг (пусть это будет настройка БД, папка или что-то подобное). Если да, то пользователь запросил аборт, и вы даже можете корректно остановить вычисления.
Все, что вам нужно сделать сейчас, это определить дополнительный скрипт, который устанавливает флаг. Не забудьте снять флаг, когда завершение работы основного воркера было остановлено и все снова наладилось.