#php #apache #ubuntu #memory #process
#php #apache #ubuntu #память #процесс
Вопрос:
У меня есть виртуальная машина Ubuntu, работающая в VirtualBox, на которой размещен сервер с использованием Apache. Концепция сервера заключается в том, чтобы принимать запросы HTTP POST, сохранять их в базе данных MySQL, а затем выполнять скрипт Python с соответствующими данными POST для отображения в канале Discord.
Сам процесс работает, но каждый раз, когда скрипт PHP вызывает скрипт Python, создается новый процесс, который на самом деле никогда не заканчивается. Через несколько часов после получения оперативных данных на сервере заканчивается доступная память из-за количества затяжных процессов. PHP-скрипт имеет следующий вызов exec в качестве последней строки кода;
exec("python3 main.py $DATA");
Я хотел бы придумать способ фактически уничтожить процессы, созданные с помощью этой команды exec (используя пользовательские www-данные), либо в файле Python после выполнения скрипта, либо автоматически с настройкой Apache, о которой я, вероятно, просто не знаю.
При выполнении следующей команды в терминале я вижу разные процессы;
ps -o pid,user,%mem,command ax | sort -b -k3 -r
Появляются 3 отдельных процесса, 1 из которых ссылается на фактическую команду python3 exec, указанную в PHP;
9903 www-data 0.4 python3 main.py DATADATADATADATADATADATA
Затем другой процесс, показывающий более распространенные команды запуска -k;
9907 www-data 0.1 /usr/sbin/apache2 -k start
И, наконец, еще один процесс, очень похожий на команду PHP exec;
9902 www-data 0.0 sh -c python3 main.py DATADATADATADATADATADATA
Как я могу гарантировать, что Apache очистит эти процессы — ИЛИ что мне нужно добавить в мой Python или PHP-код, чтобы надлежащим образом выполнить скрипт на Python, не оставляя процессов?
Ответ №1:
Не понимал exec
, что команда в php будет ждать обратного вывода бесконечно. Добавил это в конец строки, которую я использовал в своем exec
вызове; > /dev/null amp;
т.е.: exec("python3 main.py $DATA > /dev/null amp;");