Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как запустить выполнение программы.exe на сервере?
Форумы портала PHP.SU » PHP » Программирование на PHP » Как запустить выполнение программы.exe на сервере?

Страниц (4): [1] 2 3 4 »
 

1. MoNSTRiK - 25 Января, 2010 - 16:59:15 - перейти к сообщению
Приветствую.

Встала резкая проблема.
Требуется при помощи php или каких либо других средств, но желательно php, заставить windows запустить программу и начать её выполнение так, как это обычно происходит при запуске мышкой.

Пример:
Существует файл, который запускает игровой сервер по CS.


Искал в интернете и нашёл способы, но они не корректно работают для запуска сервера.

№1 самый логичный.


Скрипт запускает консоль, но при запуске выводится, что невозможно загрузить файл hlds.exe, так как в файле start не верно путь указан и выполнение идёт не так. Но при обычном запуске файла start, сервер кс запускается.

если же мы сразу напишем, всё то что запускай hlds.exe в файле start
и поставим путь верный к hlds.exe
PHP:
скопировать код в буфер обмена
  1. system('"start "Counter-Strike 1.6 Server" /MIN/HIGH D:/server/hlds.exe -game cstrike +port 27014 +map de_dust2 +maxplayers 16  -noipx +sv_lan 0 -insecure -console
  2. "');

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

нашёл тако код, но не разобрался, что конкретно за что отвечает:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. system("killall hlds_run; killall hlds_i486");
  3. sleep(5);
  4. system("cd /home/скрыта/; ./hlds_run -game cstrike +maxplayers 32 +ip 91.194.10.118 +port 27010 +map de_dust2 -nomaster +sv_lan 1 > /home/скрыта/cstrike/logs/27010.log&");
  5. ?>

автор сказал что у него всё пашет.... не смог догнать пути, для чего какой и тп. особенно этот "cd /home/скрыта/"

Есть мысли?
2. Мелкий - 25 Января, 2010 - 17:35:09 - перейти к сообщению
MoNSTRiK пишет:
не смог догнать пути, для чего какой и тп. особенно этот "cd /home/скрыта/"

Это просто никсовые пути. Считайте, что для вашего случая "/home/скрыта/" равноценна "D:/server/"

В общих словах идея такая:
1) сменить каталог силами командной оболочки на тот, откуда надо запускать hlds.exe
2) запускать стандартно
3. JustUserR - 25 Января, 2010 - 17:48:25 - перейти к сообщению
MoNSTRiK пишет:
Скрипт запускает консоль, но при запуске выводится, что невозможно загрузить файл hlds.exe, так как в файле start не верно путь указан и выполнение идёт не так. Но при обычном запуске файла start, сервер кс запускается
Наверное потому что надо установить правильно рабочую папку - например с помощью обычного cd /папка и тогда уже запускать cmd-файл
Кроме того приведенный от кого-то автора код не будет работаь потому что там UNIX и в windows в частности не будет работать killall (Что немаловажно при перезапуске демонов) И помимо того в UNIXе с помощью перенапрявления вывода в файл > и оператора & обеспечивается фоновый режим - в windows для этого служит start
Таким образом задача несколько усложняется - во-первых надо проверять наличие процессов с помощью tasklist и удалять их taskkill - во-вторых при запуске надо запускать bat-файл который будет устанавливать рабочую папку и делать дальнейший запуск Вероятно надо прописывать часть переменных окружения
4. MoNSTRiK - 25 Января, 2010 - 18:22:35 - перейти к сообщению
JustUserR

Очень помог! Улыбка разобрался

вот что получилось:
PHP:
скопировать код в буфер обмена
  1. system('cd ./server/ & start "Counter-Strike 1.6 Server" /MIN/HIGH hlds.exe -game cstrike +port 27014 +map de_dust2 +maxplayers 16 +rcon_password 123456 -noipx +sv_lan 0 -insecure -console
  2. ');


Встала другая проблема.
При запуске сервера всё работает и грузится, вот только страница с которой произошёл запуск остаётся работать. Видима обмен пакетами идёт или ещё что. Как можно этого избежать? Чтобы сервер запускался и скрипт забывал про дальнейшую работу с ним.
5. EuGen - 25 Января, 2010 - 18:26:13 - перейти к сообщению
Команда не должна выполнять вывод, иначе скрипт будет ожидать окончания работы.
Соответственно перенаправьте вывод в какой-либо файл.
6. MoNSTRiK - 25 Января, 2010 - 19:05:07 - перейти к сообщению
EuGen пишет:
Команда не должна выполнять вывод, иначе скрипт будет ожидать окончания работы.
Соответственно перенаправьте вывод в какой-либо файл.


подскажите, как можно это реализовать?

чем дополнить данный код?
PHP:
скопировать код в буфер обмена
  1. system('cd ./server/ & start "Counter-Strike 1.6 Server" /MIN/HIGH hlds.exe -game cstrike +port 27014 +map de_dust2 +maxplayers 16 +rcon_password 123456 -noipx +sv_lan 0 -insecure -console');
7. Champion - 25 Января, 2010 - 20:04:53 - перейти к сообщению
> /dev/null &
8. MoNSTRiK - 25 Января, 2010 - 20:07:04 - перейти к сообщению
Champion пишет:
> /dev/null &


прописал:
PHP:
скопировать код в буфер обмена
  1. system("cd ./server/ & start.cmd > /dev/null&");


Теперь сервер не запускается. на секунду появляется окно и тут же закрывается.
что не так?
9. Мелкий - 25 Января, 2010 - 21:35:57 - перейти к сообщению
Champion, у MoNSTRiK винда на хосте ;)

MoNSTRiK, под виндой /dev/null отсутствует. Попробуйте дописать > log.txt &
Я, правда, не уверен, что сработает - с командной строкой виндов не разбирался.
10. MoNSTRiK - 25 Января, 2010 - 22:08:30 - перейти к сообщению
Мелкий пишет:
Champion, у MoNSTRiK винда на хосте ;)

MoNSTRiK, под виндой /dev/null отсутствует. Попробуйте дописать > log.txt &
Я, правда, не уверен, что сработает - с командной строкой виндов не разбирался.


Да, винда. Забыл сказать.

раньше пытался так написать:
PHP:
скопировать код в буфер обмена
  1. system("cd ./server/ & start.cmd > log.txt&");

как в варианте который в инете нашёл.

Но по прежнему браузер крутит.

Но при этом идёт запись в файл и не останавливается.

данный скрипт будет стоять (работать) на Windows Server 2008
11. JustUserR - 26 Января, 2010 - 00:58:54 - перейти к сообщению
MoNSTRiK Для того чтобы PHP-скрипт перестал висеть необходимо запускать его с перенаправление в >nul (Под windows) Но при этом проблема заключается в том что может и так не получиться - ведь под windows знак & является просто объединением команд и не запускает фонового режима (На всякий случай можете добавить 2>&1 >nul чтобы перекрыть и поток ошибок)
Если по закрытии страницы сервер все равно остается работать то можете поставить просто поменьше time_limit - а если же суть имено в том чтобы запустить daemon и продолжить работу то можете еще попробовать открыть процесс с помощью popen
12. MoNSTRiK - 26 Января, 2010 - 02:07:57 - перейти к сообщению
JustUserR пишет:
... открыть процесс с помощью popen


Спасибо!!! я понял.

Решение вот:


так как не очень много практики и опыта, заюзал не ту функцию.

Сервер запускается и скрипт тут же заканчивает работу.

Всем спасибо, кто участвовал в моём образовании Улыбка))

Респект парни!
13. JustUserR - 26 Января, 2010 - 12:59:50 - перейти к сообщению
MoNSTRiK пишет:
Открыть процесс с помощью popen
Спасибо!!! я понял.
Пожалуйста! Когда решите написать PHP-скрипт удаленного завершения сервера обращайтесь Подмигивание
14. MoNSTRiK - 27 Января, 2010 - 00:35:22 - перейти к сообщению
Цитата:
Пожалуйста! Когда решите написать PHP-скрипт удаленного завершения сервера обращайтесь


Вот, это был бы мой следующий вопрос! Улыбка)) и тема. Ну раз уж затронули данную тему.

Расскажите как это реализовать, на примере, если не сложно. А то я чувствую, что ещё сутки поисков я не выдержу Улыбка))
15. JustUserR - 27 Января, 2010 - 01:24:46 - перейти к сообщению
MoNSTRiK пишет:
Вот, это был бы мой следующий вопрос! )) и тема. Ну раз уж затронули данную тему. Расскажите как это реализовать, на примере, если не сложно. А то я чувствую, что ещё сутки поисков я не выдержу ))
Собственно говоря вся суть PHP-скрипта для остановки daemon-а заключается в том чтобы получить номер процесса и этот процесс удалить
Если на вашем сервере в консоли есть утилиты tasklist и taskkill то все предельно просто - вы сначала вызываете tasklist с заданием фильтра по имени образа или имени исполняемого файла и получаете ID процесса и потом передаете его в taskkill и завершаете соответствующий процесс ПО сути дела достаточно даже одного taskkill так как он может убирать процесс также по фильтру - описания опций этих утилит можно прочитать в консоли tasklist /? и taskkill /? соответственно
Если таких утилит нету то задача немного усложняется - так как придется использовать дополнительную внешную програмку ps для получения списка процессов (Прилагаю ее вложением) Далее вы запускаете ее и получаете вывод с помощью считывания с popen - после этого получаете номер нужного процесса - и делаете запуск posix_kill(полученный_номер_процесса,9)

 

Powered by ExBB FM 1.0 RC1