LINUX.ORG.RU

Как сделать чтобы php|c|node не запускал оболочку в новом процессе

 , , , ,


0

1

Стартую процесс exec, proc_open или через Symfony\Process, но пых запускает его всегда через оболочку (в моем случае это sh -с ffmpeg). Собственно проблема в том, что когда сам пых процесс завершается или убивается через kill, то дочерний процесс (если он работает), не убивается. Да, можно определять дочерний ПИД и гасить его, но хотелось бы без лишнего гемора. Помню на 7.0 версии, оболочка эта не создавалась, запускался напрмяую, но обновил до 7.4 и снова стало такое. хочу понять зачем пых запускает оболочку. Гугление ничего не дало, тема давняя

По теме
https://github.com/symfony/symfony/issues/5030

Если перез командой написать exec(«exec ffmreg») то оболочка не создается и все нормально завершается. Как бы такое сделать по умолчанию

★★★★

Последнее исправление: gobot (всего исправлений: 4)

Ответ на: комментарий от Noob_Linux

Да гемор это. Код уже есть существующий и переписывать его как то не охота. Как то делается чтобы пых не запускал эту оболочку долбаную, не помню как делал на старом сервере

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

При запуске процесса сделать обработчик сигнала это гемор?) что там за говнокод такой что не хочется это делать и проще написать целый пост на лоре?) По такому решению не подскажу, знаю что только в https://www.php.net/manual/ru/function.proc-open.php можно на винде обойти вызов cmd но я никогда не пользовался этой фичей.

Noob_Linux ★★★★
()
Ответ на: комментарий от Noob_Linux

Мне не нужны способы обхода, я их знаю. Я хочу понять зачем эта оболочка вообще запускается. Копаюсь сейчас в исходниках пыха...

gobot ★★★★
() автор топика

Стартую процесс exec, proc_open или через Symfony\Process, но пых запускает его всегда через оболочку (в моем случае это sh -с ffmpeg). Собственно проблема в том, что когда сам пых процесс завершается или убивается через kill, то дочерний процесс (если он работает), не убивается.

Всё логично. Судьба пыха - быстро отработать и сдохнуть, а не ждать, когда там ффмпег доделает свои дела, занимая при этом ресурсы. Не ссы против ветра короче.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

да нифига не логично. Если надо чтобы процесс в фоне работал я могу поставить & и перенаправить вывод. Ну работает же на другом сервере у меня без оболочки этой. Как то я это делал, вот не помню блин

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

да нифига не логично

У тебя процесс пхп должен сдохнуть после завершения запроса, а там ффмпег работает в фоне и пхп висит. Тебя задосят так потыкав ф5 несколько раз и все.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)

Если перез командой написать exec(«exec ffmreg») то оболочка не создается и все нормально завершается. Как бы такое сделать по умолчанию

Создаётся. Просто шелл-команда exec означает «заменить оболочку на новый процесс». То есть пхп тут ни при чём, это оболочка видит что написано exec и запускает ffmpeg не дочерним процессом а вместо себя в своём pid-е.

А так, если ты хочешь запустить командную строку - она всегда будет запускаться через шелл, других вариантов нет и не было. Без шелла можно (теоретически, а как это в пхп - не знаю) запустить программу передав отдельными строками полный путь к её бинарнику и список аргументов (по 1 строке на аргумент). Если же функция принимает одну строку на всё - то там точно шелл внутри.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Какого запроса? Я в консоле запускаю. Да и вообще не важно, пусть даже процесс fpm работает сколько угодно, это мои заботы, а не пхп и сервера

gobot ★★★★
() автор топика
Ответ на: комментарий от no-such-file

Почитай опции в доках

Да вот не могу найти блин. Все уже перечитал

А через шелл запускается чтобы применялся PATH

да, это тоже логично, но в данном случае мне все это не надо...

gobot ★★★★
() автор топика
Ответ на: комментарий от firkax

она всегда будет запускаться через шелл, других вариантов нет и не было

Да можно! У меня на старом сервере с пхп7.0 так и было. 1 процесс создается, без всяких шелов. Как то я делал, забыл

gobot ★★★★
() автор топика

Дело не в конфиге пхп, проверял на разных

На одном сервере Debian 9(в котором оболочка не запускается) запускаю

php -r "exec('sleep 100');"
ps -ax | grep "sleep 100"

 8497 pts/1    S+     0:00 php -r exec('sleep 100');
 8498 pts/1    S+     0:00 sleep 100
 8570 pts/2    S+     0:00 grep sleep 100

pstree -p 8497

php(8497)───sleep(8498)




Тут все нормально, оболочка не создается.
Запускаю от root. Пробовал запускать от разных пользователей. Пробовал запускать с дефолтным конфигом и без конфига (-n). Все равно оболочка не создается как и мне нужно. Пхп не перекомпилирован, дефолтный, из пакетов

На другом Debian 11, новом, где оболочка запускается
php -r "exec('sleep 100');"
ps -ax | grep "sleep 100"

 709652 pts/3    S+     0:00 php -r exec('sleep 100');
 709653 pts/3    S+     0:00 sh -c sleep 100
 709654 pts/3    S+     0:00 sleep 100
 709716 pts/4    S+     0:00 grep sleep 100



pstree -p 709652

php(709652)───sh(709653)───sleep(709654)



Появляется прокладка - sh

gobot ★★★★
() автор топика
Последнее исправление: gobot (всего исправлений: 4)
Ответ на: комментарий от firkax

То есть пхп тут ни при чём, это оболочка видит что написано exec и запускает ffmpeg не дочерним процессом а вместо себя в своём pid

Вот вот, это мне и надо. Как бы сделать это по дефолту для всех запусков

gobot ★★★★
() автор топика

Скопировал бинарь php, на новый сервер, запустил там и опа - sh создается. Значит дело в пхп и не в его версии, а в окружении каком то Debian'a.

Более того, это не зависит от пхп

Проверил даже на nodejs

const exec = require("child_process").execSync
exec("sleep 100");


И даже на С
#include <stdlib.h>

int main()
{
    system("sleep 100");
    sleep(1000);
    return 0;
}


Все тоже самое, на одном сервере оболочка создается как отдельный процесс, на другом нет.

Что там такое магическое может быть, что на одном сервере shell не создает отдельный процесс, а на другом создает?

gobot ★★★★
() автор топика
Последнее исправление: gobot (всего исправлений: 2)

О, задача ещё сузилась

Оболочка создается как отдельный процесс

/bin/sh -c "sleep 100"
996055 pts/3    S+     0:00 /bin/sh -c sleep 100
996056 pts/3    S+     0:00 sleep 100
996097 pts/4    S+     0:00 grep sleep 100


Оболочка не создается
/bin/sh -c "sleep 100"
28835 pts/1    S+     0:00 sleep 100
31466 pts/3    S+     0:00 grep sleep 100

gobot ★★★★
() автор топика
Последнее исправление: gobot (всего исправлений: 1)

Оооо, как обычно, разговор самим с собой дал результат ))

Дело было в symlink /bin/sh, который на одном сервере указывал на bash (там где все ок), и на dash на другом.

Теперь создается всегда 1 дочерний процесс, без прокладки sh

gobot ★★★★
() автор топика