Страница 1 из 1

Как перехватить Skip рендера?

Добавлено: Пт ноя 20, 2020 11:12 am
AlexeySmolenchuk
Есть ситуации, когда при прерывании таска(рестарт, eject, stop), дочерний процесс(hick, nuke) не завершается и продолжает нагружать процессор или просто не высвобождают память. Есть ли возможность как-то перехватить такое прерывание таска или может быть как-то более хитро организовать сам процесс его формирования?

Re: Как перехватить Skip рендера?

Добавлено: Пт ноя 20, 2020 1:18 pm
Timur
Вообще-то там уже не мало хитростей сделано для того чтобы закрывались все дочерние процессы.
Но пределу совершенства нету. Можно дальше ковырять в коде этот вопрос.
Правда я с такими ситуяциями практически не сталкиваюсь, особенно на линухе.

Re: Как перехватить Skip рендера?

Добавлено: Пт ноя 20, 2020 1:59 pm
AlexeySmolenchuk
С hick это однозначно проявляется.
Можешь в двух словах рассказать какие механизмы ты уже применил, и как убедиться что они отрабатывают?

Re: Как перехватить Skip рендера?

Добавлено: Пт ноя 20, 2020 3:46 pm
Timur
Да в общем-то применен достаточно классический метод для линуха.
Сразу после 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. Дочерние процессы наоткрывали сеансов ещё.
- Это плохо, лучше так не делать, может есть настройка для этого.

Re: Как перехватить Skip рендера?

Добавлено: Пн ноя 23, 2020 2:19 pm
AlexeySmolenchuk
да, похоже что как раз последний вариант, так как у меня получается утка в зайце, заяц в ларце.

Код: Выделить всё

afrender
    python (env confiration)
        hython (open scene - hrender_af)
            hick (экспорт архива и рендер в отдельном процессе через Popen)

Re: Как перехватить Skip рендера?

Добавлено: Пн ноя 23, 2020 4:46 pm
Timur
Дочерние процессы могут открывать ещё дочерние процессы, те ещё и так далее, лишь бы в одном сеансе осталось всё.
Надо чтобы дочерние не вызывали setsid и setpgrp.

Re: Как перехватить Skip рендера?

Добавлено: Пн ноя 23, 2020 4:50 pm
Timur
Конечно если сами что-то пишете, то скорее всего не на Си, а на питоне или баше.
Надо смотреть в каких случаях Popen может создавать новую группу.
В баше тоже стараться не использовать su, sudo.
В общем надо копать, создал ли кто-то новую группу, если да, то кто, когда и зачем.