Создайте сеанс Linux Screen и получите его PID

Я пытаюсь создать класс-оболочку PHP вокруг утилиты Linux Screen.
Мне нужно иметь возможность начать сеанс экрана по имени и получить PID экрана, который был создан.

Я не могу предположить, что имя сеанса уникально поэтому он не может разобрать session -ls выход, чтобы найти PID.

Основываясь на примерах и предложениях в Интернете, я попробовал следующий подход, используя PHP Exec () функция:

screen -D -m -S 'screen_name' 2>&1 &

-D Параметр указывает экрану не форкать процесс, поэтому он имеет тот же PID, что и фоновый процесс.

Итак, тогда я могу разобрать PID с выхода & Оператор фоновой оболочки в следующем формате:

[<number>] <pid>

Эта команда работает из оболочки Linux (немедленно завершается), но когда я запускаю ее из PHP, она зависает и браузер никогда не загружает страницу.

Я попытался выполнить его с помощью PHP exec () и shell_exec (), и это тот же результат.

Я также перепробовал множество различных комбинаций с последней частью команды, такие как описанные ВОТ.

Редактировать:

Если я использую эту команду:

screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & 2>&1

Тогда PHP exec() работает. Он запускает сеанс экрана, но затем я не получаю вывод от & фоновый оператор. Я предполагаю, что это потому, что я перенаправляю stdout а также stderr в /dev/null но, насколько я знаю, он должен делать это только для команды экрана, а не & оператор.

ПОЧТИ РЕШЕНИЕ:

screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $!

Я понял, что текст, отображаемый в терминале от & Оператор фона на самом деле не пришел из команды stdout или stderr. Это оболочка, отображающая это. Итак, я добавил echo $! после & оператор, который будет печатать PID процесса, созданного последней командой.

Это работает в терминале, он печатает правильный PID. Но когда он выполняется в PHP, фактическое значение PID на экране на 4 больше, чем значение, возвращаемое echo,
Это как эхо выполняется до того, как & оператор. Есть ли способ заставить его ждать?

РЕШЕНИЕ:

Я обернул команду в sudo, и оператор фона работал с командой sudo вместо команды screen. Убедитесь, что вы избегаете аргументов вашей команды! 🙂

0

Решение

ПОЧТИ РЕШЕНИЕ:

screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $!

Я понял, что текст, отображаемый в терминале от & Оператор фона на самом деле не пришел из команды stdout или stderr. Это оболочка, отображающая это. Итак, я добавил echo $! после & оператор, который будет печатать PID процесса, созданного последней командой.

Это работает в терминале, он печатает правильный PID. Но когда он выполняется в PHP, фактическое значение PID на экране на 4 больше, чем значение, возвращаемое echo,
Это как эхо выполняется до того, как & оператор. Есть ли способ заставить его ждать?

РЕШЕНИЕ:

Я обернул команду в sudo, и оператор фона работал с командой sudo вместо команды screen. Убедитесь, что вы избегаете аргументов вашей команды! 🙂

— Брэдли Оделл

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]