@FAnbu

Как корректно использовать exec() в PHP?

Здравствуйте.

Имеется игровой сервер который работает в фоновом режиме и запускается вводом последовательных команд:
- screen -S srv
- cd srv
- ./start.sh

Используется скрипт написанный на PHP для мониторинга доступности игрового сервера. Если он по какой-то причине недоступен, то скрипт получает PID процесса и убивает его, а также запускает сервер при помощи команд которые написаны выше.

В скрипте используется функция exec(), код выглядит таким образом exec("screen -S srv && cd srv && ./start.sh"); но почему-то выполняется только первая команда screen -S srv, а остальные игнорируются. Каким образом можно выполнить все команды для запуска сервера?

Хочу подметить:
- если ввести все команды в ssh вручную, то все работает, имеется ввиду все команды в одну строку.
- все команды необходимо выполнить последовательно, без разделения команд.
  • Вопрос задан
  • 265 просмотров
Решения вопроса 1
@Akela_wolf
Extreme Programmer
Утилита screen нужна только для терминала (чтобы процесс не убился когда закроете терминал)
Команда cd - команда шелла (изменить текущую директорию)

Так что вам, на самом деле, нужна единственная команда для запуска сервера: srv/start.sh

Если же все-таки нужно выполнить несколько команд, то для этого нужен запуск шелла: /bin/sh -c 'cmd1 && cmd2 && cmd3 && ... etc ...'

Еще можете посмотреть функцию PHP shell_exec
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ValdikSS
@ValdikSS
Screen — интерактивный мультиплексор терминала. Вводя эти команды последовательно, вы сначала запускаете screen, затем, пока он запущен, внутри него вводите другие две.
Запуская все три команды через "&&", две остальные команды выполнятся вне screen (на вашем настоящем tty/pty) после завершения screen.

Правильный вариант запуска — через инит-систему (systemd unit для подавляющего большинства современных линуксов).
Альтернативный вариант через screen:
screen -dmS srv -- sh -c 'cd /path/to/srv && ./start.sh'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы