parserALT
Страницы форума: ← Назад | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 600 | Дальше →

Запуск приложения и продолжение работы скрипта

#1AndreyIl
29.08.11 15:07 / 15:07
www.parser.ru → | ответить → | в избранное →

Запуск приложения и продолжение работы скрипта

Необходимо запустить, например, калькулятор и продолжить выполнение скрипта.
Пробую так:
$fFile[^file::exec[c:\windows\system32\calc.exe]]

В итоге скрипт висит и чего-то ждет, калькулятор не запускается.

В винде в консоли можно в бат-файле прописать "start calc.exe", калькулятор запустится, а команды консоли будут отрабатывать дальше по списку.

Если запустить бат-файл указанным выше способом, то та же картина.

Есть ли способ запустить скрипт/приложение и не дожидаться окончания его работы?
#2max_rip
→ AndreyIl [#1] | 29.08.11 15:22
www.parser.ru → | ответить → | в избранное →
Тоже интересует такая возможность но под linux, пробовал указывать &, все равно parser ждал окончания фоновой задачи.
#3Vint
→ max_rip [#2] | 29.08.11 15:24
www.parser.ru → | ответить → | в избранное →

Для linux читать про nohup

#4max_rip
→ Vint [#3] | 29.08.11 22:49
www.parser.ru → | ответить → | в избранное →

Читал, не устраивает...

что весь stdout и stderr, перенаправляют туда куда мне на надо,хотя я не пробовал пере направить его сам.
#5Vint
→ max_rip [#4] | 29.08.11 23:45
www.parser.ru → | ответить → | в избранное →
Если не перенаправлять, то родительский процесс будет ждать ответа. Чего парсер и делает.
#6max_rip
→ Vint [#5] | 30.08.11 03:13 / 03:26
www.parser.ru → | ответить → | в избранное →
Мне это надо для обновления базы, раз в месяц с одной конторы приходят обновления в виде sql файлов. Один из них более 130м. Файлы приплывают в архиве через форму, который распаковывается на сервере.
Увы у хостинга есть ограничения на время ожидания (nginx), после которого иногда получается ошибка. ДА и логичнее всего, дождаться заливки файла на хост, и запустить процесс обновления в фоном режиме, а при обновлении странички показывать лог этого процесса.
Было удобно, добавить флаг, не ожидать ответа. А просто запустить процесс в свободное плавание.

Попробовал вот так
$status[^file::exec[run.sh;]]

где
run.sh
nohup ./update.sh > ./../../data/tmp/update.log 2>&1

Все равно браузер висел, пока update.sh не было полностью выполнен.
#7Misha v.3
→ max_rip [#6] | 30.08.11 04:32
www.parser.ru → | ответить → | в избранное →

а парсер тут вообще зачем? :)

я бы сделал так:
1. есть форма, у которой обработчик -- парсер. через форму на сервер просто грузится файл и записывается в определённое место (возможно происходит его распаковка)
2. есть sh-скрипт, запускаемый по cron, проверяющий наличие файла, и если файл есть -- делающий его распаковку и выполнение, записывая результат в log-файл и удаляя исходный файл после завершения работы.

при отображении формы (шаг 1) там-же показывается результат последнего выполнения загрузки (log).

собственно sh-скрипт может реагировать не на само наличие файла с данными, а на какой-нить flag-файл (чтобы не хранить несколько последних версий данных и иметь возможность повторно загрузить их не ожидая заливки файла браузером на сервер)
#8AndreyIl
→ Misha v.3 [#7] | 30.08.11 10:13
www.parser.ru → | ответить → | в избранное →
Есть сайт на парсере, к нему надо прикрутить запуск и остановку приложения, чтобы не давать терминальный доступ.
Остановку сделал через вызов taskkill, работает, т.к. программа выгружается после вызова.
Остается только запуск.

Есть в парсере способ запустить скрипт/приложение и не дожидаться окончания его работы?
#9moko
→ AndreyIl [#8] | 30.08.11 11:17
www.parser.ru → | ответить → | в избранное →

Это функциональность shell

Запускать программы разными способами умеет shell.

И на свойство процесса умирать при завершении запускающего процесса парсер повлиять не может.

Вас думаю интересует примерно такая команда:

nohup what.you.need >execute.log &
#10AndreyIl
→ moko [#9] | 30.08.11 11:32
www.parser.ru → | ответить → | в избранное →
Пишут, что это для никсов, а мне нужно решение для винды.
#11moko
→ max_rip [#6] | 30.08.11 12:02
www.parser.ru → | ответить → | в избранное →

&

Надо добавить &, чтобы процесс запустился в background.
#12moko
→ AndreyIl [#10] | 30.08.11 12:05
www.parser.ru → | ответить → | в избранное →

start

В Windows аналогом является команда start.

http://ss64.com/nt/start.html
#13AndreyIl
→ moko [#12] | 30.08.11 12:11
www.parser.ru → | ответить → | в избранное →
В первом посте писал, что создавал батник с текстом "start calc.exe", запускал его из парсера, но не помогло.

Если запускать без батника, то нужно знать полный путь к приложению.
В случае start не в курсе, какой путь прописывать.
#14Vint
→ AndreyIl [#13] | 30.08.11 13:20
www.parser.ru → | ответить → | в избранное →

Ну ведь быстро гуглится...

Взять тулзу.
В батнике прописать:
psexec -isd "c:\windows\system32\calc.exe"


Это и будет некоторый аналог nohup.
#15AndreyIl
→ Vint [#14] | 30.08.11 13:24
www.parser.ru → | ответить → | в избранное →
Гуглится немного не в том направлении.:)
Интересует решение на парсере без сторонних программ.
#16Vint
→ AndreyIl [#15] | 30.08.11 13:28
www.parser.ru → | ответить → | в избранное →
А start и calc (как пример) не сторонние программы? И nohup в линуксе туда же.
#17AndreyIl
→ Vint [#16] | 30.08.11 13:48
www.parser.ru → | ответить → | в избранное →
calc - это приложение, которое нужно запустить.
start - не знаю полный путь, иначе попробовал бы запустить calc через него с помощью exec.

Интересует возможность запуска приложения через парсер без привлечения того, чего нет в системе.
Каков полный путь к start?
#18Misha v.3
→ AndreyIl [#17] | 30.08.11 13:55
www.parser.ru → | ответить → | в избранное →

start -- это не программа, это фича виндовй shell

#19AndreyIl
→ Misha v.3 [#18] | 30.08.11 13:59
www.parser.ru → | ответить → | в избранное →
Это я понял, потому и спросил про путь, т.к. в exec надо указывать полный путь к запускаемому приложению.
#20Vint
→ AndreyIl [#19] | 30.08.11 14:04
www.parser.ru → | ответить → | в избранное →
А вы попробуйте без полного пути и увидите, что всё работает.
Но через start парсер будет ждать завершения процесса.
#21AndreyIl
→ Vint [#20] | 30.08.11 14:11
www.parser.ru → | ответить → | в избранное →
Это я описал в первом посте, не подходит.
Нужен запуск и продолжение работы парсерного скрипта, не дожидаясь, когда запущенное приложение закончит работу.
#22Vint
→ AndreyIl [#21] | 30.08.11 14:16
www.parser.ru → | ответить → | в избранное →

Тогда возвращаемся к «Запуск приложения и продолжение работы скрипта [Ну ведь быстро гуглится...]»

Или возьмите нативный Windows Script Host и напишите свой скрипт для запуска.
#23max_rip
→ Misha v.3 [#7] | 30.08.11 14:32
www.parser.ru → | ответить → | в избранное →

Ну как зачем...

Идея с кроном была, но как-то не гуд она. Ставить раз в минуту проверку появления файла, делать лок при запуске обновления, куда-то отправлять отчет об успешом/не успешном выполнении + время реакции. Люди они такие, тыркнули на кнопочку и хотят получить результат).
#24max_rip
→ moko [#11] | 30.08.11 14:33
www.parser.ru → | ответить → | в избранное →

А он точно отпустит парсер?

Я немного путаюсь в этих всех пере направлениях вывода
так будет правильно?
nohup ./update.sh > ./../../data/tmp/update.log 2>&1 &
#25Vint
→ max_rip [#24] | 30.08.11 14:51
www.parser.ru → | ответить → | в избранное →
В этом случае в update.log будет писаться и вывод скрипта update.sh и его же ошибки, в случае их возникновения.

Если ошибки нужно писать отдельно, то:
nohup ./update.sh > ./../../data/tmp/update.log 2> ./../../data/tmp/update_error.log &


Но! В таком варианте оба файла логов будут перезаписываться каждый раз при запуске скрипта. Есле нужно дописывать файлы, т.е. вести нормальный лог, то:
nohup ./update.sh >> ./../../data/tmp/update.log 2>> ./../../data/tmp/update_error.log &
#26
→ Vint [#25] | 30.08.11 15:01
www.parser.ru → | ответить → | в избранное →
Я знаю разницу между >> и > +).
Я просто путаюсь в этих магических конструкциях 2>&1, вроде постепенно начал доходить их смысл. Меня интересует один общий лог файл, его так проще клиенту выводить. Второй раз они не запустят апдейт, у меня реализован лок
echo $$ > .pid

а в парсере
^if(-f "${pathTmpDir}.pid"){
		$status[^file::exec[status.sh;;${pathTmpDir}.pid]]
		^if($status.status == 0){
{...}{...}
}
где status.sh
#!/bin/sh
pid=`cat ./../../data/tmp/.pid`
if `kill -CHLD $pid >/dev/null 2>&1`
	then exit 0
	else exit 1
fi

Пишу отдельный скрипты, чтоб проще было с шелом работать, а то указывать каждый раз пути не удобно ).
#27moko
→ max_rip [#23] | 30.08.11 15:32
www.parser.ru → | ответить → | в избранное →

про cron

У нас например стоят лимиты CPU и памяти на cgi скрипты, поэтому ничего сверхобъемного cgi скрипт (или запущенный им процесс) все равно сделать не сможет. На скрипты, запускаемые из cron лимиты тоже есть, но гораздо более либеральные. Так что и от настроек окружения многое зависит.
#28Sumo
→ max_rip [#23] | 30.08.11 15:56
www.parser.ru → | ответить → | в избранное →

Ничего необычного - обычная асинхронная обработка...

Да и пользователь вполне спокойно подождет, если вы ему напишете, что задача поставлена в очередь и результат будет через несколько минут (часов, дней :). Задачи можно складывать в базу, хороший алгоритм описан в статье Якова Сироткина - http://telamon.ru/articles/async.html

У него пример для Оракла, но я похожий алгоритм использовал для работы с Кошельком Киви: счета хранил в таблице MySQL, а при поиске счетов для проверки использовал синтаксис select ... for update.
#29Misha v.3
→ max_rip [#23] | 30.08.11 17:28
www.parser.ru → | ответить → | в избранное →
вы работаете с ограниченными ресурсами.
делаете заведомо долгую работу.
в этом случае запросто можете не вписаться в имеющиеся ресурсы (процессорное время, память и timeout браузера).

например вчера сервер был не нагружен, поэтому sql скрит загрузился на 2.5 мин, и браузер дождался ответа.

сегодня сервер был загружен и загрузка данных происходила 3.5 мин и браузер отвалился по таймауту.

пользователь от таких неопределённостей ни фига не счастлив (нет ничего хуже, когда система то работает, то -- нет). к тому-же ему придётся повторно качать на сервер большой файл (а каналы бывают несимметричные + медленные, т.е. upload больших файлов может быть не в радость).

если подумать заранее и сразу сделать как следует, то как раз пользователь страдать не будет.

например:
файл загрузился, вы его записали, поставили нужные флаги для cron-а и пользователю в окошке написали, что обработка начнётся через 3 мин. 40 сек (вам известно когда запускается скрипт обработки из крона, т.е. можете посчитать).
заодно браузеру отдали указание сделать refresh через эти самые 3:40
пройдёт это время -- браузер сам обновит страницу и пользователь увидит сообщение, что данные загружаются (или распаковываются, ведь вы из sh-скрипта тоже можете выставлять флаги текущего состояния).
очередной авто-рефреш через 30 сек -- и довольный пользователь видит или "данные загружаются" или "данные успешно загружены".

при этом и серверные ресурсы вы сберегли: не создавали один долгий процесс, потребляющий много памяти который мог-бы и не вписаться в лимиты), который должен был сначала получить многомегабайтный файл от пользователя (в память), потом сохранить, потом выполнить пару долгих внешних скриптов (распаковка + загрузка данных).
#30max_rip
→ Misha v.3 [#29] | 30.08.11 22:11
www.parser.ru → | ответить → | в избранное →

Логика крона и разделения мне понятно изначально...

я как раз таки и хочу разгрузить время выполнения и запустить скрипт апдейта в отдельном потоке.
Мне не понятно почему, парсер не может запустить запустить процесс и забыть о нем, не дожидаясь пока он будет выполнен.
Единственный плюс крона - возможно другие переменные окружения и лимиты на выполнение. Если же таковых лимитов нет, я подозреваю у меня что в кроне, что процесс запущенный из cgi окружения выполняются с одинаковыми лимитами и приоритетами. То почему я не могу запустить такой процесс из парсера напрямую?
Я изначально заложил моменты, ожидания выполнения скрипта на сервере с выводом текущей обстановки в лог файл.
#31Sumo
→ max_rip [#30] | 30.08.11 23:58
www.parser.ru → | ответить → | в избранное →

Парсер делает exec, не fork-exec...

... что вполне логично и правильно. Если необходимо иное поведение, то это делается на уровне ОС через внешние программы, о чем в этой ветке подробно писали.

p.s. Тот способ, который вы упорно хотите использовать, конечно, имеет право на жизнь, но для выполнения асинхронных задач есть более простые и надежные способы.
#32max_rip
→ max_rip [#24] | 31.08.11 00:40
www.parser.ru → | ответить → | в избранное →

добавление в конце & помогло)

#33AndreyIl
→ Vint [#22] | 31.08.11 09:49
www.parser.ru → | ответить → | в избранное →
Написал .vbs из двух строк, запустил через wscript/cscript.
Только приложение запускается с правами пользователя, запустившего апач, т.е. SYSTEM.

Сделать RunAs через vbs пока не получилось, брал рабочий код из VB 6.0, но vbs ломается сразу на объявлении типов и функций.

Это уже не к парсеру.:)
#34Misha v.3
→ AndreyIl [#33] | 31.08.11 15:23
www.parser.ru → | ответить → | в избранное →

а ведь могли-бы эту пару строк кода на vbs тут написать, для потомков, так сказать :)

#35AndreyIl
→ Misha v.3 [#34] | 31.08.11 16:21
www.parser.ru → | ответить → | в избранное →
Приложение - калькулятор.
1. Содержимое файла C:\1.vbs:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "C:\windows\system32\calc.exe"


2. Запуск:
$fFile[^file::exec[C:\WINDOWS\system32\wscript.exe;;C:\1.vbs]]

или
$fFile[^file::exec[C:\WINDOWS\system32\cscript.exe;;C:\1.vbs]]


3. Закрытие всех экземпляров:
$fFile[^file::exec[c:\windows\system32\taskkill.exe;;/F;/FI;"IMAGENAME eq calc.exe"]]


Не стал сразу публиковать код, т.к. посчитал, что для форума парсера это не нужно.:)
#36Vint
→ AndreyIl [#33] | 31.08.11 16:43
www.parser.ru → | ответить → | в избранное →

runas

Готовые примеры
#37AndreyIl
→ Vint [#36] | 31.08.11 16:49
www.parser.ru → | ответить → | в избранное →
Уже читал, но это извратный способ, да и работать должен при нахождении в системе, а запуск в моем случае будет вне профиля, пример из подобных тем не сработал.
#38max_rip
→ AndreyIl [#33] | 31.08.11 17:21
www.parser.ru → | ответить → | в избранное →
Вы же можете сменить юзера от которого запускается апач.
#39AndreyIl
→ max_rip [#38] | 31.08.11 17:33
www.parser.ru → | ответить → | в избранное →
Не могу, но можно использовать любую прогу, которая запускает приложение от имени пользователя.
На VB 6.0 я такую писал, но для других целей.

Сейчас у меня уже нет такого компилятора, поэтому пробую через vbs, иначе поправил бы исходники и передавал бы параметрами логин и пароль.
Страницы форума: ← Назад | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 600 | Дальше →