получить PID процесса 1С

1. evgeniy.korenev 06.05.11 03:38 Сейчас в теме
День добрый, коллеги.

Так и не нашел места, куда бы приткнуть свой вопрос, что бы он был в тему.

В общемто сабж.

По сути есть сервер, на котором кроме людей работают еще и боты "1С"... и бывает момент, что кто то из них "умирает". В дереве процессов есть несколько одноименных процессов 1Сv7.exe. А вот как опредилить, какой именно из них уже висит - непонятно.
Естественно, что если бы меня интерисовл вопрос "рученоого воскрешения умершого" - я бы и не парился особо. но задача сделать это програмно.

Вопрос: можно ли как то получить PID процесса 1C из пол ние самой, что б передать уго кудато дальше (не суть куда)?

Заранее благодарен.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. vcv 89 08.05.11 08:28 Сейчас в теме
Самый простой вариант, который сразу приходит в голову, это сделать несколько пользователей-роботов, у каждого указан личный каталог в конфигураторе. PID процесса определять утилитой handle от sysinternals по файлу 1cv7.lck в каталоге пользователя.
Для проверки "живости" сделать в выполняемой обработке, например, регулярное сохранение файл-флага. Потом проверять другим процессом дату-время файл-флага. Если слишком старый - робот повис.
6. kittystark 15 08.05.11 13:12 Сейчас в теме
идею в (2) с отдельным пользователем для каждого бота поддерживаю,
далее отвечая на сабж:
в коде 1С создать объект MSScriptControl.ScriptControl, в нем задать код обращения к WMI
strComputer = "." 
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")

Set colProcesses = objWMIService.ExecQuery( _
    "select * from win32_process where name='1cv7.exe'" )
For Each objProcess in colProcesses
    PID = objProcess.ProcessId
    cmd = objProcess.CommandLine
    If objProcess.GetOwner ( User, Domain ) = 0 Then
          Wscript.Echo "Process " & _
              objProcess.Caption & _
              " belongs to " & Domain & _
              "\" & User
    Else
          Wscript.Echo "Problem " & Rtn & _
              " getting the owner for process " _
              & objProcess.Caption
    End If
Next
Показать

если твои роботы запускаются через OLE, то в переменной cmd будет подстрока embedding - круг кандидатов можно еще сузить
8. Abadonna 3958 08.05.11 13:59 Сейчас в теме
(6)If objProcess.GetOwner ( User, Domain ) = 0 Then
может ни фига и не дать, один юзверь в одном домене модет несолько процессов запустить, с разными PID.
Надо PID по хэндлу конкретного окна искать
10. evgeniy.korenev 08.05.11 14:47 Сейчас в теме
по сути, пока тут шло активное осуждение, решение было найдено.
подсказал мне его "Кириллка" с форума "Миста", за что ему и спасибо...

Функция ПолучитьPID()
    Перем oLocator, oService, oShell, oApp, oChildProcess;
    Перем чPID;

    чPID = -1;
    Попытка
        oLocator = СоздатьОбъект("WbemScripting.SWbemLocator");
        oService = oLocator.ConnectServer(".", "root\CIMV2");
        
        // Запускаем дочерний rundll32.exe
        oShell = СоздатьОбъект("WScript.Shell");
        oApp = oShell.Exec("rundll32.exe kernel32,Sleep");
        // Получаем rundll32 по PID'у
        oChildProcess = oService.Get("Win32_Process.Handle=" + oApp.ProcessID);
        // Получаем PID родительского процесса - 1с
        чPID = oChildProcess.ParentProcessID;
        // Завершаем rundll32, чтобы не мусорить
        oChildProcess.Terminate();
    Исключение
        // нуу, может не быть прав на эти вещи, например.
    КонецПопытки;
    Возврат чPID;
КонецФункции // ПолучитьPID()
//__________________________________________________________­______________________
 
Процедура Сформировать()
    Сообщить("PID: " + ПолучитьPID());
КонецПроцедуры // Сформировать()
Показать


проверил... работает замечательно...
поцепил это счастье в "ПриначалеРаботыСистемы()" после определения глПользователь... прям там и храню все то время, пока он "жив"

ну а перезапуск по сути так же , как и (2) предложил, вот только в файл пишу еще и PID, а треевой прожкой проверяю, должен ли он был бы быть запущен, и ели да, то пере запускаю...

ну в общем то применений есть масса...
спасибо за помощь!
Serg2000mr; Mr.Fermer; ybatiaev; dour-dead; +4 Ответить
4. tango 540 08.05.11 10:39 Сейчас в теме
"В реестре по адресу HKCU\Control Panel\Desktop находится ключ HungAppTimeout, значение которого определяет интервал (в миллисекундах), через которое не отвечающее приложение считается зависшим. Кроме этого ключа, в той же ветви находятся ключи WaitToKillServiceTimeout (задаёт время ожидания перед уничтожением зависшей службы), и AutoEndTasks (при установке его значения в 1 системе дается разрешение удалять зависшие процессы самостоятельно)."
5. tango 540 08.05.11 11:40 Сейчас в теме
taskkill.exe /f /fi "status eq not responding"
7. kittystark 15 08.05.11 13:17 Сейчас в теме
легкое дополнение: wscript.echo - это для того, чтобы можно было код отладить, поместив его в *.vbs файл, в 1С это будет лишним...
9. Abadonna 3958 08.05.11 14:08 Сейчас в теме
11. Alex_Nash 28.09.21 06:20 Сейчас в теме
В случае v8 используем форматирование PID дочернего процесса

// Получаем rundll32 по PID'у
oChildProcess = oService.Get("Win32_Process.Handle=" + Формат(Число(oApp.ProcessID), "ЧГ="));


В противном случае рискуем попасть на
Произошла исключительная ситуация (SWbemServicesEx): Invalid object path
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот