Как перехватить Skip рендера?
- AlexeySmolenchuk
- Сообщения: 40
- Зарегистрирован: Пт июл 14, 2017 10:38 am
Как перехватить Skip рендера?
Есть ситуации, когда при прерывании таска(рестарт, eject, stop), дочерний процесс(hick, nuke) не завершается и продолжает нагружать процессор или просто не высвобождают память. Есть ли возможность как-то перехватить такое прерывание таска или может быть как-то более хитро организовать сам процесс его формирования?
- Timur
- Site Admin
- Сообщения: 178
- Зарегистрирован: Вс июл 09, 2017 4:59 pm
- Откуда: Королёв
- Контактная информация:
Re: Как перехватить Skip рендера?
Вообще-то там уже не мало хитростей сделано для того чтобы закрывались все дочерние процессы.
Но пределу совершенства нету. Можно дальше ковырять в коде этот вопрос.
Правда я с такими ситуяциями практически не сталкиваюсь, особенно на линухе.
Но пределу совершенства нету. Можно дальше ковырять в коде этот вопрос.
Правда я с такими ситуяциями практически не сталкиваюсь, особенно на линухе.
Тимур Хайрулин
CGRU 3.3.1 Ubuntu 22.04LTS, MS Windows 10 (clients only).
CGRU 3.3.1 Ubuntu 22.04LTS, MS Windows 10 (clients only).
- AlexeySmolenchuk
- Сообщения: 40
- Зарегистрирован: Пт июл 14, 2017 10:38 am
Re: Как перехватить Skip рендера?
С hick это однозначно проявляется.
Можешь в двух словах рассказать какие механизмы ты уже применил, и как убедиться что они отрабатывают?
Можешь в двух словах рассказать какие механизмы ты уже применил, и как убедиться что они отрабатывают?
- Timur
- Site Admin
- Сообщения: 178
- Зарегистрирован: Вс июл 09, 2017 4:59 pm
- Откуда: Королёв
- Контактная информация:
Re: Как перехватить Skip рендера?
Да в общем-то применен достаточно классический метод для линуха.
Сразу после fork и до exec дочерний процесс вызывает фи-ю которая его сетапит:
https://github.com/CGRU/cgru/blob/maste ... m.cpp#L430
Она очень простая:
https://github.com/CGRU/cgru/blob/maste ... ss.cpp#L41
Она создаёт сеанс setsid.
А потом, когда мы хотим кильнуть, мы отправляем сигнал группе killpg( getpgid( m_pid), SIGKILL);
https://github.com/CGRU/cgru/blob/maste ... s.cpp#L636
В инернете мануалов на эти системные вызовы и вообще куча инфы на тему как завешать дочерние процессы.
Так же важно знать что афрендер сначала посылает SIGTERM:
https://github.com/CGRU/cgru/blob/maste ... s.cpp#L622
И даёт какое-то время процессу завершиться самому. И только по истечению этого времени он убивает процесс, если тот ещё не вышел.
Некоторые процессы удаляют временные файлы, и делают что-то ещё, если им что-то небходимо для корректного завершения.
Возможные сбои:
1. Процесс завершился не корректно сам по SIGTERM. Сам плохо всё почистил и завершился. Афрендер уже ничего не киляет.
- Можно сказать что это баг процесса. Надо ругаться разработчикам.
2. Процессу не хватило прав создать сеанс setsid
- Такое бывало на странных системах - можно проверить если запустить всё от рута. А потом тюнить права.
3. Дочерние процессы наоткрывали сеансов ещё.
- Это плохо, лучше так не делать, может есть настройка для этого.
Сразу после fork и до exec дочерний процесс вызывает фи-ю которая его сетапит:
https://github.com/CGRU/cgru/blob/maste ... m.cpp#L430
Она очень простая:
https://github.com/CGRU/cgru/blob/maste ... ss.cpp#L41
Она создаёт сеанс setsid.
А потом, когда мы хотим кильнуть, мы отправляем сигнал группе killpg( getpgid( m_pid), SIGKILL);
https://github.com/CGRU/cgru/blob/maste ... s.cpp#L636
В инернете мануалов на эти системные вызовы и вообще куча инфы на тему как завешать дочерние процессы.
Так же важно знать что афрендер сначала посылает SIGTERM:
https://github.com/CGRU/cgru/blob/maste ... s.cpp#L622
И даёт какое-то время процессу завершиться самому. И только по истечению этого времени он убивает процесс, если тот ещё не вышел.
Некоторые процессы удаляют временные файлы, и делают что-то ещё, если им что-то небходимо для корректного завершения.
Возможные сбои:
1. Процесс завершился не корректно сам по SIGTERM. Сам плохо всё почистил и завершился. Афрендер уже ничего не киляет.
- Можно сказать что это баг процесса. Надо ругаться разработчикам.
2. Процессу не хватило прав создать сеанс setsid
- Такое бывало на странных системах - можно проверить если запустить всё от рута. А потом тюнить права.
3. Дочерние процессы наоткрывали сеансов ещё.
- Это плохо, лучше так не делать, может есть настройка для этого.
Тимур Хайрулин
CGRU 3.3.1 Ubuntu 22.04LTS, MS Windows 10 (clients only).
CGRU 3.3.1 Ubuntu 22.04LTS, MS Windows 10 (clients only).
- AlexeySmolenchuk
- Сообщения: 40
- Зарегистрирован: Пт июл 14, 2017 10:38 am
Re: Как перехватить Skip рендера?
да, похоже что как раз последний вариант, так как у меня получается утка в зайце, заяц в ларце.
Код: Выделить всё
afrender
python (env confiration)
hython (open scene - hrender_af)
hick (экспорт архива и рендер в отдельном процессе через Popen)
- Timur
- Site Admin
- Сообщения: 178
- Зарегистрирован: Вс июл 09, 2017 4:59 pm
- Откуда: Королёв
- Контактная информация:
Re: Как перехватить Skip рендера?
Дочерние процессы могут открывать ещё дочерние процессы, те ещё и так далее, лишь бы в одном сеансе осталось всё.
Надо чтобы дочерние не вызывали setsid и setpgrp.
Надо чтобы дочерние не вызывали setsid и setpgrp.
Тимур Хайрулин
CGRU 3.3.1 Ubuntu 22.04LTS, MS Windows 10 (clients only).
CGRU 3.3.1 Ubuntu 22.04LTS, MS Windows 10 (clients only).
- Timur
- Site Admin
- Сообщения: 178
- Зарегистрирован: Вс июл 09, 2017 4:59 pm
- Откуда: Королёв
- Контактная информация:
Re: Как перехватить Skip рендера?
Конечно если сами что-то пишете, то скорее всего не на Си, а на питоне или баше.
Надо смотреть в каких случаях Popen может создавать новую группу.
В баше тоже стараться не использовать su, sudo.
В общем надо копать, создал ли кто-то новую группу, если да, то кто, когда и зачем.
Надо смотреть в каких случаях Popen может создавать новую группу.
В баше тоже стараться не использовать su, sudo.
В общем надо копать, создал ли кто-то новую группу, если да, то кто, когда и зачем.
Тимур Хайрулин
CGRU 3.3.1 Ubuntu 22.04LTS, MS Windows 10 (clients only).
CGRU 3.3.1 Ubuntu 22.04LTS, MS Windows 10 (clients only).