Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

функция exec вылетает Апач (Dimazhan, оценка: 1)
Author Message
Dimazhan
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Feb 10, 2009 8:35 pm (написано за 1 минуту 48 секунд)
   Post subject: функция exec вылетает Апач
Reply with quote

При выполнении такого скрипта:
Code (php): скопировать код в буфер обмена
$denwer_dir = "..\\..\\denwer\\";
$command = "restart.exe";
exec (www.php.net/exec)($denwer_dir.$command);
Перезапускается все кроме Апача...
Запускается (появляется значек в трее), затем исчезает (значек)...

Как перезапустить Denwer из скрипта PHP?
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Tue Feb 10, 2009 8:44 pm (спустя 9 минут; написано за 1 минуту 4 секунды)
   Post subject:
Reply with quote

Dimazhan wrote:
Как перезапустить Denwer из скрипта PHP?
Боюсь, надо просто добавить вызов fork(); в скрипт перезапуска, примерно такую конструкцию:
Code (perl): скопировать код в буфер обмена
if(fork (www.perldoc.com/perl5.6/pod/func/fork.html)() != 0) exit (www.perldoc.com/perl5.6/pod/func/exit.html);
Попробуйте сделать это самостоятельно :).
Back to top
View user's profile Send private message Send e-mail
Dimazhan
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Feb 10, 2009 8:52 pm (спустя 7 минут; написано за 9 секунд)
   Post subject:
Reply with quote

не получается
Code (any language): скопировать код в буфер обмена
Call to undefined function fork()
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Tue Feb 10, 2009 9:44 pm (спустя 52 минуты; написано за 24 секунды)
   Post subject:
Reply with quote

Dimazhan
Не в PHP, а в скриптах запуска, которые написаны на Perl.
Back to top
View user's profile Send private message Send e-mail
Dimazhan
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Feb 10, 2009 10:01 pm (спустя 16 минут; написано за 21 секунду)
   Post subject:
Reply with quote

Юрий Насретдинов wrote:
Не в PHP, а в скриптах запуска
Секция start или stop?
Back to top
Dimazhan
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Feb 10, 2009 10:10 pm (спустя 8 минут; написано за 1 минуту 3 секунды)
   Post subject:
Reply with quote

Ругается :)
syntax error at apache.pl line 81, near ") exit"
Немного изменил:
Code (perl): скопировать код в буфер обмена
if (fork (www.perldoc.com/perl5.6/pod/func/fork.html)() != 0) {exit (www.perldoc.com/perl5.6/pod/func/exit.html);}
Результат:
The fork function is unimplemented at apache.pl line 81.
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Wed Feb 11, 2009 12:04 am (спустя 1 час 54 минуты; написано за 1 минуту 34 секунды)
   Post subject:
Reply with quote

Dimazhan
Млин... Это, вероятно, проблема с miniperl... Попробуйте поставить полноценный ActiveState Perl (есть соответствующее расширение для Денвера). Если нужно, то замените в соответствующих .pl-скриптах (их может быть много :( ) путь до "правильного" perl.
Back to top
View user's profile Send private message Send e-mail
Dimazhan
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Feb 11, 2009 12:13 am (спустя 8 минут; написано за 33 секунды)
   Post subject:
Reply with quote

Спамибо за помощь!
Качаю...
Скорость маааленькая :(
Back to top
Guest






Карма: 388
   поощрить/наказать


PostPosted: Wed Feb 11, 2009 12:15 am (спустя 1 минуту 47 секунд; написано за 34 секунды)
   Post subject:
Reply with quote

Опечатка -> Читать Спасибо :D
Dimazhan wrote:
Спамибо
Back to top
Dimazhan
Заглянувший



Joined: 11 Feb 2009
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Wed Feb 11, 2009 1:31 am (спустя 1 час 16 минут; написано за 4 минуты 30 секунд)
   Post subject:
Reply with quote

Юрий Насретдинов wrote:
Это, вероятно, проблема с miniperl... Попробуйте поставить полноценный ActiveState Perl
Похоже, что это не проблема с miniperl.
C ActiveState Perl та же песня...
Останавливает...Запускает...Закрывается, никаких ошибок!!! Я добавил лог для ошибок при старте, тоже ни-че-го...

Как же перезагрузить сервер...

Ставил задержку,
Code (perl): скопировать код в буфер обмена
sleep (www.perldoc.com/perl5.6/pod/func/sleep.html)(5);
не помогает.

Одно хорошо - ругаться
The fork function is unimplemented at apache.pl line 81.
перестал - это точно miniperl
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Wed Feb 11, 2009 3:20 am (спустя 1 час 48 минут; написано за 9 минут 42 секунды)
   Post subject:
Reply with quote

Dimazhan
Попробуйте помимо этого перенаправить вывод в файл (к примеру, Restart.exe >nul). А что на fork() перестало ругаться это замечательно.

P.S. Файл nul -- специальный, всё, что в него записывается, уходит вникуда.

P.P.S. Вероятно, надо добавить не в apache.pl мою строчку с fork(), а гораздо раньше -- именно в тот скрипт, который вызывается с помощью Restart.exe. Кстати говоря, попробуйте открыть в каком-нибудь хорошем редакторе (хотя, может и с блокнотом прокатить, не забудьте сделать бэкап) файлик Restart.exe и найти строчки с "miniperl.exe". Замените (в режиме с предварительно нажатой (и отпущенной) клавишей Insert, в котором содержимое именно переписывается, а не вставляется) вызов miniperl.exe на вызов "нормального" и вставьте мою строчку с fork() в Control.pl в секцию с restart'ом (хотя, можете и в начало вставить, но в этом случае Вам придется ещё менять пути до perl в Run.exe, Boot.exe и Stop.exe).

P.P.P.S. Вероятно, можно добавить просто файлик 00_fork в папку scripts/main/restart/ с примерно таким содержимым: init.d/fork. После чего, создать в папке scripts/init.d файл fork.pl с примерно таким содержимым:
Code (perl): скопировать код в буфер обмена
#!perl -w
if(fork (www.perldoc.com/perl5.6/pod/func/fork.html)() != 0) { exit (www.perldoc.com/perl5.6/pod/func/exit.html); }
Впрочем, моя строчка лучше всего будет работать, если добавить fork() прямо в самом начале Control.pl
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Wed Feb 11, 2009 6:17 am (спустя 2 часа 56 минут; написано за 7 минут 34 секунды)
   Post subject:
Reply with quote

В общем, ни один финт ушами с Perl, который я придумал, к сожалению, не работает :(.

После долгих попыток сделать перезапуск "в лоб", я предлагаю использовать программу, которую я написал и скомпилировал с помощью MingW (а не Visual Studio):
Code (c): скопировать код в буфер обмена
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <windows.h>

int main(int argc, char *argv[])
{
        struct stat buf;
        int status;

        for(;;)
        {
                status = stat("need_restart", &buf);

                if(!status)
                {
                        unlink("need_restart");
                        unlink("restart_done");

                        system(".\\restart");

                        fclose(fopen("restart_done","w+"));
                }

                Sleep(5000);
        }

        return 0;
}
Бинарник с названием restarter.exe нужно положить в папочку /denwer/ (это можно понять, посмотрев на код :).

После этого, restarter нужно запустить (вполне подходит вариант просто даблкликнуть по файлу) и свернуть.

Программа каждые 5 секунд проверяет наличие файла need_restart в папке /denwer/. То есть, минимальный скрипт на пхп, который будет перезапускать Денвер, выглядит так:
Code (php): скопировать код в буфер обмена
<?
fclose (www.php.net/fclose)(fopen (www.php.net/fopen)("/denwer/need_restart","w+"));
?>
По завершении перезапуска, программа создает файл restart_done в той же папке.

Простенький пример скрипта, который отслеживает, что перезапуск завершен:
Code (php): скопировать код в буфер обмена
<?

chdir (www.php.net/chdir)('/denwer/');

if(isset (www.php.net/isset)($_GET['check_status']))
{
        if(file_exists (www.php.net/file_exists)("restart_done"))
        {
                echo (www.php.net/echo) "  !<script>top.stop_refresh();</script>";
                unlink (www.php.net/unlink)("restart_done");
        }else if(!file_exists (www.php.net/file_exists)("need_restart"))
        {
                echo (www.php.net/echo) "  ,  ...";
        }
       
        die (www.php.net/die)();
}

fclose (www.php.net/fclose)(fopen (www.php.net/fopen)("need_restart","w+"));

?>

<script>
function check_server()
{
        var el = document.getElementById('status_checker');
       
        el.src = "<?=$_SERVER['PHP_SELF']?>?check_status=true&rnd="+Math.random();
}

var server_checker = setInterval(check_server, 3000);

function stop_refresh()
{
        clearInterval(server_checker);
}
</script>

<iframe src="<?=$_SERVER['PHP_SELF']?>?check_status=true" id="status_checker" width="100%" height="70" border="0"></iframe>
Можно переделать на свой вкус, добавив нормальный AJAX и т.д. и т.п.

Попробуйте, у Вас должно заработать (хотя не обещаю, если что, будем разбираться).


restarter.exe.zip
 Description:
Вирусов не должно быть :). Если совсем мне не доверяете, скомпилируйте код сами

Download
 Filename:  restarter.exe.zip
 Filesize:  5.35 KB
 Downloaded:  591 Time(s)

Back to top
View user's profile Send private message Send e-mail
Dimazhan
Заглянувший



Joined: 11 Feb 2009
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Wed Feb 11, 2009 3:11 pm (спустя 8 часов 54 минуты; написано за 4 минуты 20 секунд)
   Post subject:
Reply with quote

Скачал, запустил, но...
Опять он не запускается!

Все нормально работает, но Апач вылетает...

Убрал вообще строчку
Code (perl): скопировать код в буфер обмена
if (fork (www.perldoc.com/perl5.6/pod/func/fork.html)() != 0) {exit (www.perldoc.com/perl5.6/pod/func/exit.html);}
сработало!!!

После перезагрузки сервера php скрипт удаляет файл restart_done но по прежнему выводит сообщение:
Quote:
Перезагрузка сервера запущена, пожалуйста подождите...
В скрипте поменял только строчки, остальное все также.
Code (php): скопировать код в буфер обмена
chdir (www.php.net/chdir)('..\\..\\denwer\\');
if(isset (www.php.net/isset)($check_status))
Back to top
View user's profile Send private message Send e-mail
Dimazhan
Заглянувший



Joined: 11 Feb 2009
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Wed Feb 11, 2009 3:24 pm (спустя 12 минут; написано за 2 минуты 11 секунд)
   Post subject:
Reply with quote

Увеличил интервал опроса до 10000...
Работает, после небольшого тормоза браузера (когда Апач запускался).
Спасибо.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Wed Feb 11, 2009 4:02 pm (спустя 37 минут; написано за 29 секунд)
   Post subject:
Reply with quote

Dimazhan
Ну, мой скрипт был для примера и не лишён недостатков :). Предполагалось, что Вы напишете свой вариант.
Back to top
View user's profile Send private message Send e-mail
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9989
   поощрить/наказать


PostPosted: Tue Mar 03, 2009 1:56 pm (спустя 19 дней 21 час 54 минуты)
   Post subject:
Reply with quote


М

Перенесено из форума: Баги (не-баги Денвера здесь запрещены!) :: Денвер.
Перенесено в форум: Базовый пакет :: Денвер.
Back to top
View user's profile Send private message
fifanutri
Заглянувший



Joined: 14 Feb 2015
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Sat Feb 14, 2015 10:34 am (спустя 5 лет 11 месяцев 10 дней 20 часов 38 минут; написано за 21 секунду)
   Post subject:
Reply with quote

а в скриптах запуска, которые написаны на Perl.



_______________________

Cheap Fut Coins (www.mmosam.com/)
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML