Long time script execution

User avatar
dot
Уже с Приветом
Posts: 4461
Joined: 17 Jun 2003 04:41

Long time script execution

Post by dot »

А вот кто делал такое?

Есть сkрипт(PERL), который долго выполняется. Хочется его стартовать одним скриптом, потом делать Redirect и показывать updated status(v %%) уже исползуя другой скрипт(everything in CGI, via Apache)

Когда я пишу:

Code: Select all

$| = -1; #то же самое что и flush in C
print "Pragma: no-cache
Location: $location

";
exec ($srcipt.name);

or

Code: Select all

$| = -1; 
print "Pragma: no-cache
Location: $location

";
do ($srcipt.name);


сервер закрывает коннекшен и убивает скрипт.

Если написать without flush:

Code: Select all

print "Pragma: no-cache
Location: $location

";
do ($srcipt.name);

то сервер ждет пока весь скрипт отработает.


ПС. настройки сервера в - дело обсуждаемое с админом, поетому не хотелось бы ничего там менять.
,,, ^. .^ ,,,
User avatar
idle0
Уже с Приветом
Posts: 2846
Joined: 28 Jun 2000 09:01
Location: Milwaukee, WI

Post by idle0 »

Вот как я бы сделал:


Code: Select all

print "Pragma: no-cache 
Location: $location

";
system("$srcipt.name 2>&1 >/dev/null &");
moria# show running-config
User avatar
dot
Уже с Приветом
Posts: 4461
Joined: 17 Jun 2003 04:41

Post by dot »

Если не ошибаюсь, то так тоже не работало- в смысле что я system пробовала и STDOUT в дев-нул отправляла(правда, только стдоут), но как только браузер уходил на другой скрипт - сервер процесс убивал. Почему - непонятно. Вроде, exec д.б. выполнять все как надо, но не захотел.
Беглый просмотр apache.org и всяких RFC ничего не дал... Однако, я его все-же обхитрила при помощи javascript location :)
,,, ^. .^ ,,,
bison
Новичок
Posts: 90
Joined: 20 Aug 2003 11:56
Location: Frankfurt/M

Post by bison »

dot wrote:Если не ошибаюсь, то так тоже не работало- в смысле что я system пробовала и STDOUT в дев-нул отправляла(правда, только стдоут), но как только браузер уходил на другой скрипт - сервер процесс убивал. Почему - непонятно. Вроде, exec д.б. выполнять все как надо, но не захотел.


Надо было SIGHUP в фоновом процессе перехватывать (может быть ещё и SIGTERM)
User avatar
dot
Уже с Приветом
Posts: 4461
Joined: 17 Jun 2003 04:41

Post by dot »

bison wrote:Надо было SIGHUP в фоновом процессе перехватывать (может быть ещё и SIGTERM)


Спасибо, я честно говоря, решила вашим советом воспользоваться(перехватывать сигналы). Но тут возникла одна проблемка - скрипты действительно тяжелые(д. исполняться минут 30-40), и обнаружилось, что после 7-10 минут(в среднем) скрипт погибает. Есть у меня подозрение, что все дела в настройках апача - директива TimeOut, она по умолчанию 300.
В общем, точно сказать пока не могу, но есть ощущение, что апач в конце концов убивает скрипт по SIGKILL, а это уже не перехватывается.

Однако же, обнаружилось, что если фоновый процесс стартовать имеено "фоном" - bg при помощи & - то вроде пока все работает, и сервер убивать скрипт не пытается.

Теперь собственно вопрос: это протоколированная фича (пишется для Linux RH + Апач)? Потому что очень не хочется снова все переписывать(кроме того, непонятно как это все переписывать, если в новой версии RH или Апача эта возможность будет убрана). В общем, any comments are appreciated.

Лучше бы, конечно обяснение почему процессу в bg, когда он запушен через веб, позволяется работать сколько угодно, и серверу о нем "забывает", но если ето что-то такое, что совсем стыдно не знать, то можно просто сказать на какую команду man сделать. :) Спасибо.
,,, ^. .^ ,,,

Return to “Вопросы и новости IT”