Provavelmente, você não pode.
A lógica de
cpulimit
é bem simples, é preciso um pid de processo e simplesmente enviar seu sinal kill -STOP $PID
, depois kill -CONT $PID
, e de novo, de novo e de novo e de novo ......
E medindo o uso da cpu para calcular o atraso entre STOP e CONT.
No seu caso, pstree
do complexo bash-script levaria N * x telas do console.
Posso sugerir outro método para fazer o downgrade do uso de cpu de qualquer script bash ou até executável binário.
1) nice
- seu processo de tomada e aumentando ou diminuindo sua prioridade de -20 (Prioridade mais alta) para 20 (Prioridade mais baixa). Provavelmente em um diapasão muito baixo, é por isso que aparecem outros utils e ganchos de kernel:
2) ionice
- pode ser a segunda geração de nice
. Você pode separar processos por prioridade de 0 (prioridade mais baixa) a 7 (prioridade mais alta). Além disso, você poderia separar os processos por classes, em tempo real (maior), best-efforts
(meio), ocioso (mais baixo) e nenhum (padrão).
3) chrt
- a maior coisa que eu já conheci, é semelhante a cpulimit
por seu poder e domínio no processo. Aqui você também pode encontrar classes de prioridade, idle
, real-time
, fifo
, batch
, etc ... E diapasão de prioridades muito grandes, de 1 a 99.
Por exemplo, você pode iniciar um processo enorme com chrt -r -p 99 process
- e ele consumirá todos os seus recursos.
Da mesma forma, qualquer daemon enorme poderia funcionar suavemente em "background" com chrt -r -p 0 process
- ele irá esperar por todos os outros enquanto os recursos de um sistema estiverem ocupados.
De qualquer forma, sugiro que você leia man chrt
e man ionice
antes de começar.
Por exemplo, estou usando rtorrent
para p2p. É a tarefa de menor prioridade para o meu sistema, então eu estou lançando de tal forma:
nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
Ou, você pode pegar o jeito dos ganchos e dos haks. E escreva seu próprio script cpulimit_wrapper. Por exemplo:
# cat bash_script.sh
#!/bin/bash
while sleep 0; do
find /
dd if=/dev/random of=/tmp/random.bin bs=1M count=1000
done
mais
# cat cpulimit.sh
#!/bin/bash
TARGET=$1
[ -z "$TARGET" ] && echo "Usage bash cpulimit.sh command" && exit 1
cpulimit -l 1 bash $TARGET
while sleep 0;do
lsof -n -t $TARGET | xargs pstree -p | sed -e 's/(/(\n/g' | sed -e 's/)/\n)/g' | egrep -v '\(|\)' | while read i; do
echo $i;
cpulimit -l 1 -b -p $i;
done
done