Как изменить все потоки (и дочерние элементы) одного процесса в Linux?

См. https://wiki.archlinux.org/index.php/qt

Пакеты Qt не предоставляют обычные bin (например, qmake ) больше в / usr / bin .

Вместо -qt5 , -qt4 и -qt3 предоставляются символические ссылки (например, qmake-qt5 , qmake- qt4 , qmake-qt3 ).

23
30.10.2016, 15:03
4 ответа

Хорошая стоимость или доли ЦП?

Обратите внимание, что в настоящее время хорошие значения могут быть не столь актуальны »система -wide », из-за автоматической группировки задач, особенно при использовании systemd . См. этот ответ для получения более подробной информации.

Разница между потоками и процессами

Важный вопрос по Linux, потому что документация увековечивает сомнения (например, в отношении потоков, не имеющих собственного PID).

Примечание: этот ответ точно объясняет потоки Linux.

Вкратце: ядро ​​обрабатывает только «выполняемые объекты», то есть то, что может быть запущено и запланировано . С точки зрения ядра эти объекты называются процессами. Поток - это просто процесс, который разделяет (по крайней мере) пространство памяти и обработчики сигналов с другим.

Каждый такой процесс имеет уникальный для всей системы идентификатор: PID (идентификатор процесса). Для так называемых потоков его иногда называют TID (Thread ID), но с точки зрения системного администратора (и ядра!) TID и PID - это одно и то же (они имеют одно и то же пространство имен).

В результате вы можете переименовывать каждый «поток» по отдельности, потому что у них есть свой собственный PID 1 .

Рекурсивный поиск всех PID для renice

Нам нужно получить PID всех процессов («нормальный» или «поток»), которые являются потомками (дочерними или в группе потоков) для - внимательный процесс. Это должно быть рекурсивным (учитывая детей детей).

Ответ Антона Леонтьева дает подсказку для этого: все имена папок в / proc / $ PID / task / являются PID потока, содержащего дочерний список потенциальных файлов детские процессы.

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

#!/bin/sh
[ "$#" -eq 1 -a -d "/proc/$1/task" ] || exit 1

PID_LIST=
findpids() {
        for pid in /proc/$1/task/* ; do
                pid="$(basename "$pid")"
                PID_LIST="$PID_LIST$pid "
                for cpid in $(cat /proc/$1/task/$pid/children) ; do
                        findpids $cpid
                done
        done
}

findpids $1
echo $PID_LIST

Если PID процесса 1234 - это тот, который вы хотите рекурсивно улучшить, теперь вы можете сделать:

renice -n 15 -p $(/path/to/findchildren.sh 1234)

1 Обратите внимание, что для соответствия POSIX вызов getpid (2) в потоке не даст вам общесистемный уникальный идентификатор (PID) этого исполняемого объекта, а скорее PID основной процесс в «группе потоков». Вместо этого вам нужно будет вызвать gettid (2) . См. этот ответ для получения дополнительной информации.

14
27.01.2020, 19:42

Вы можете использовать / proc / $ PID / task , чтобы найти все потоки данного процесса, поэтому вы можете использовать

$ ls /proc/$PID/task | xargs renice $PRIO

to переименовывать все потоки , принадлежащие данному процессу.

Таким же образом / proc / $ PID / task / $ PID / children можно использовать для поиска всех дочерних процессов (или / proc / $ PID / task / * / children , если вам нужны все дочерние процессы из всех потоков данного процесса).

$ cat /proc/$PID/task/$PID/children | xargs renice $PRIO
$ cat /proc/$PID/task/*/children | xargs renice $PRIO
30
27.01.2020, 19:42

Я бы рекомендовал использовать аргумент -g (группы процессов )вместо -p (идентификатора процесса )при использовании renice. Он делает то же самое без bash -foo.

т.е.

(sudo) renice -n <NEW_PRIORITY> -g <MAIN_PROCESS_ID>
2
27.01.2020, 19:42

Вот мой сценарий:

pgrep -v <PROCESS_NAME> | sudo xargs renice <NEW_PRIORITY>
0
27.01.2020, 19:42

Теги

Похожие вопросы