Я пытаюсь создать класс-оболочку 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. Убедитесь, что вы избегаете аргументов вашей команды! 🙂
ПОЧТИ РЕШЕНИЕ:
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. Убедитесь, что вы избегаете аргументов вашей команды! 🙂
— Брэдли Оделл
Других решений пока нет …