|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
Запускаю программы через терминал Do ^Programma1 Иногда запускаю программы через JOB Все названия программ известны, могу через
Имеется отдельная программа, которая ДОЛЖНА в случае сбоя отключать все запущенные процессы и завершить (мягко) работу. Можно конечно в каждую программу встроить проверочный блок - что если с БД появилось сообщение (ключ) о завершении работы, то данные процессы самоликвидируются через "HALT" (обращается к глобальной переменной, в которой указано что нужно прекратить работу). Проблема в том, что при большой нагрузке, начинаются сбои и ошибочно вылазит код о принудительном завершении. Редко, но все же. Встал вопрос - знаю как определить номер процесса. Есть служебные слова (не знаю как сказать) для запуска внешних программ. По логике, должна быть строка кода, которая также может и прервать выполнение определённой программы. Запустил в терминале программу Код: plaintext 1. 2.
Можно завершить жестко, остальное доделывает ^StopProgramm. Если у вас есть код больше двух строк (с наворотами), то буду работать по старинке (через обращение к переменной в БД). Ищу простое решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:26 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
Нужно, чтобы программа не самоликвидировалась, а чтобы её остановила, прервала другая ВНЕШНЯЯ программа. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:35 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:44 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
DAiMorО-О-О, $system.Process. Terminate (pid) или $zu(4,pid)C первым вариантом прошло на ура, а вот второй вариант - работать не хочет. Разобрался. Если написать do $zu(4,6756) где 6756 - это номер запущенного процесса, то тогда также закрывается DO $SYSTEM.Process.Terminate(6756) Равнозначны Спасибо, DAiMor. Вопросов больше нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:59 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
Всё не так однозначно. Случай из жизни: процесс мог работать очень долго, но иногда надо было его прибить (для прекращения обслуживания некоего оборудования). Но процесс мог упасть и сам из-за ошибки. Так вот на нагруженном сервере 5-ти значный номер процесса мог повториться достаточно быстро (в течение суток), поэтому знать номер процесса оказалось мало, пришлось проверять переменную процесса и прибивать его, лишь если ей присвоено правильное значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 21:51 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
Alexey MaslovВсё не так однозначно. Случай из жизни: процесс мог работать очень долго, но иногда надо было его прибить (для прекращения обслуживания некоего оборудования). Но процесс мог упасть и сам из-за ошибки. Так вот на нагруженном сервере 5-ти значный номер процесса мог повториться достаточно быстро (в течение суток), поэтому знать номер процесса оказалось мало, пришлось проверять переменную процесса и прибивать его, лишь если ей присвоено правильное значение. Чтобы управлять процессами во внешней программе необходимо вести Pidы запущенных процессов и если появился дубликат, то предыдущий процесс уже удален и значит по нему никаких действий предпринимать не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 06:04 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
Alexey MaslovВсё не так однозначно. Случай из жизни: процесс мог работать очень долго, но иногда надо было его прибить (для прекращения обслуживания некоего оборудования). Но процесс мог упасть и сам из-за ошибки. Так вот на нагруженном сервере 5-ти значный номер процесса мог повториться достаточно быстро (в течение суток), поэтому знать номер процесса оказалось мало, пришлось проверять переменную процесса и прибивать его, лишь если ей присвоено правильное значение. Вот этот вопрос у меня сегодня и возник утром. Как узнать перечень ВСЕХ запущенных процессов с их ИМЕНЕМ и НОМЕРОМ PID, чтобы затем, можно было вручную поотключать их. Как на снимке Alexey Maslov, ваше решение проблемы было бы интересно (опять ищу функцию, которая бы выводила список всех запущенных процессов с их именами и PID-ами). P.S. Кстати, $ZU очень интересная/занимательная функция. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 08:03 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
Снимок ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 08:04 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
Кстати, по моим соображениям, Получение списка всех запущенных процессов существенно распараллеливает процессы. К примеру, нужно вывести несколько графиков в один отчет. Каждый выводится от 3 до 7 сек, причем всегда по разному. Обычно, я не замарачиваюсь и запускаю их последовательно. Получается примерно 15 сек на один отчет. Все графики выводятся по одной анализируемой дате. Таких дат за раз около 180-250. Если же знать номер процесса и его название, то можно задать генерацию графиков одновременно и опрашивать запущенные процессы. После генерации PDF отчета с графиками, программа завершает работу через Halt. Итого в остатке получаем - как только в списке запущенных процессов не осталось запущенных программ по генерации графиков, можем запускать следующий цикл по генерации отчетов PDF с графиками. Ориентировочное время сокращение работы уменьшится с 15 сек до 5-6 секунд. Наверняка у многих периодически возникают такие задачи (генерации отчетов по одним данным) и затем генерация следующего отчета (после успешной генерации предыдущего отчета). А это возможно только при последовательном выполнении отчетов, программы, чтобы не запустить процесс генерации нового отчета раньше времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 08:18 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
О-О-О, Мы запускаем программу в Job-е. Чтобы узнать PID процесса, в котором она исполняется используем код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 08:34 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
CacheUK, Спасибо. То что нужно. Направление понял. Ваш код сработал без запинок. Если указать s Process=##CLASS(%SYS.ProcessQuery).Open("J14") то будет выведен процесс под номером 14 (самый первый столбец #Job). Здесь уже идёт нумерация подряд и без дырок в нумерации. Не путать нумерацию Pid (где каше выдаёт случайное число) и нумерацию кол-ва запущенных процессов (Job). Таким способом можно перебрать все существующие процессы, запущенные в Cache. Более подробно %SYS.ProcessQuery ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 09:22 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
О-О-ОНужно, чтобы программа не самоликвидировалась, а чтобы её остановила, прервала другая ВНЕШНЯЯ программа.Было: 9162920 , 6973280 О-О-ОP.S. Кстати, $ZU очень интересная/занимательная функция.Которой не следует пользоваться. О-О-ОКак узнать перечень ВСЕХ запущенных процессов с их ИМЕНЕМ и НОМЕРОМ PID, чтобы затем, можно было вручную поотключать их.ДокументацияFor other aspects of process management, refer to the %SYS.ProcessQuery class. Process Management PS: ещё может пригодиться останов зависших процессов: $SYSTEM.Util.CleanDeadJobs() . ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 09:27 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
О-О-ОКстати, по моим соображениям, Получение списка всех запущенных процессов существенно распараллеливает процессы. К примеру, нужно вывести несколько графиков в один отчет. Каждый выводится от 3 до 7 сек, причем всегда по разному. Обычно, я не замарачиваюсь и запускаю их последовательно. Получается примерно 15 сек на один отчет. Все графики выводятся по одной анализируемой дате. Таких дат за раз около 180-250. Если же знать номер процесса и его название, то можно задать генерацию графиков одновременно и опрашивать запущенные процессы. После генерации PDF отчета с графиками, программа завершает работу через Halt. Итого в остатке получаем - как только в списке запущенных процессов не осталось запущенных программ по генерации графиков, можем запускать следующий цикл по генерации отчетов PDF с графиками. Ориентировочное время сокращение работы уменьшится с 15 сек до 5-6 секунд. Наверняка у многих периодически возникают такие задачи (генерации отчетов по одним данным) и затем генерация следующего отчета (после успешной генерации предыдущего отчета). А это возможно только при последовательном выполнении отчетов, программы, чтобы не запустить процесс генерации нового отчета раньше времени.Для достижения этого эффекта можно и даже нужно использовать события . Вот минимальный пример кода: Код: plaintext 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.
Более развёрнутые примеры выложены на GitHub тут и тут . Также есть обсуждение на community портале InterSystems . ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 11:18 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
eduard93Более развёрнутые примеры выложены на GitHub тут и тут . Также есть обсуждение на community портале InterSystems .И даже тут ( 17624921 ) и тут ( 13880300 ), причём на русском, чего очень бы хотелось и от ветки intersystems-ru . ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 11:32 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
servitпричём на русском, чего очень бы хотелось и от ветки intersystems-ru . Несмотря на название у нас там всё-таки международное комьюнити, так что английский язык выбран выбран в качестве основного при написании кода/комментариев. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 12:37 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
eduard93servitпричём на русском, чего очень бы хотелось и от ветки intersystems-ru .Несмотря на название у нас там всё-таки международное комьюнити, так что английский язык выбран выбран в качестве основного при написании кода/комментариев.К коду/комментариям вопросов нет и не было, а вот описания, инструкции, возможно и документацию, хотелось бы видеть в том числе и на русском, как это сделано у других:
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 13:01 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 13:11 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
servit eduard93 , А ведь был же русский когда-то:вики проекта MDX2JSON (кроме примеров вывода) полностью доступны как на английском так и на русском языках. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 14:10 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
eduard93А это и сейчас бывает.Вот именно, что бывает. PS: что ж, бывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 14:25 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
О-О-ОAlexey Maslov, ваше решение проблемы было бы интересноНомера процессов были известны из $zchild (все они были JOB-нутыми) и сохранялись в глобале, поэтому получение их списка с PID и т.д. не требовалось. Проблема состояла в том, как достоверно узнать, является ли процесс с известным номером (PID) тем самым процессом, который мы когда-то запустили для решения определённой задачи, или его номер случайно совпал с номером "нашего" процесса (а наш аварийно завершился). Определить это по имени программы было нельзя, т.к. одна и та же программа могла использоваться в различных процессах. Поэтому остановились на запросе значения переменной с известным именем у процесса с известным PID, для чего вполне подошёл запрос VariableByPid класса %SYS.ProcessQuery. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 14:36 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
Alexey Maslov, Я так же хотел пойти по вашей схеме - при запуске программы записывать в глобал название программы и его PID. В моём случае - проще, т.к. программы запускаются утром а отключаются часов с 16 до 20 вечера.Alexey MaslovПоэтому остановились на запросе значения переменной с известным именем у процесса с известным PID, для чего вполне подошёл запрос VariableByPid класса %SYS.ProcessQuery.Имеете ввиду, что даже связка PID+имя процесса не даёт уникальность. В результате чего потребовалась третья переменная. Типа внутри процесса висит переменная доступная для внешних программ (типа Public) и при её опросе - если она та самая - глушите, убиваете процесс "имя_процесса+PID+значение_переменной_из_имя_запущенной_программы". Никогда с таким решением не сталкивался. Есть повод подумать на будущее. Честно говоря даже не ожидал такого количества решений. Мне в принципе подойдет любое из предложенных решение, т.к. одновременно запущенных процессов от 45 до 80, а с таким количеством вариантов справится любой из предложенных вариантов. Буду взвешивать плюсы и минусы P.S. Об "Аварийное завершение программ" и дальнейшем их "зависании" в списке PID даже не задумывался. Так что этот вариант точно придётся брать в расчёт. Всем спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 18:05 |
|
Как принудительно завершить процесс
|
|||
---|---|---|---|
#18+
О-О-ОНикогда с таким решением не сталкивался.Благодаря вам задумался: зачем было делать так сложно? Не я был автором прикладного кода, лишь придумал способ проверки "свой-чужой" и реализовал её в виде метода, который проверяет живость процесса и возвращает значение заданной переменной. Проверяемый процесс может быть запущен либо локально, либо на сервере данных ECP. Однако гораздо проще было написать код для JOB^%ZSTOP, в котором всего-навсего удалять: Код: javascript 1.
Тогда "глобальная" таблица процессов обновлялась бы динамически, и не требовалось бы лазить в чужую память (что, кстати, требует некоторого повышения полномочий). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 19:34 |
|
|
start [/forum/topic.php?fid=39&msg=39204014&tid=1556502]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 265ms |
total: | 414ms |
0 / 0 |