É bem simples. Reúna o id do processo e os ids dos threads e, em seguida, chame taskset
.
pname="java" # for example
for pid in $(pgrep "${pname}")
do
[ "${pid}" != "" ] || exit
echo "PID: ${pid}"
for tid in \
$(ps --no-headers -ww -p "${pid}" -L -olwp | sed 's/$/ /' | tr -d '\n')
do
taskset -cp "${tid}" # substitute thread id in place of a process id
done
done
Saídas
PID: 15695
pid 15695's current affinity list: 0
pid 15696's current affinity list: 0
pid 15697's current affinity list: 0
...
A razão pela qual isso não é um simples one-liner é porque o comando pgrep
não pode retornar ids de thread (apenas ids de processo). Nós fazemos um pequeno trabalho extra com o comando ps --no-headers -ww -p "${pid}" -L -olwp
Testado no Ubuntu 12, bash 4.