Eu criei um script que mata processos se o uso da CPU e / ou memória atingir 80%. Ele cria uma lista de processos mortos quando isso acontece. O que posso fazer para melhorar isso?
while [ 1 ];
do
echo
echo checking for run-away process ...
CPU_USAGE=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_USAGE_THRESHOLD=800
PROCESS=$(ps aux r)
TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1)
if [ $CPU_USAGE -gt $CPU_USAGE_THRESHOLD] ; then
kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1) #original
kill -9 $(ps -eo pcpu | sort -k 1 -r | grep -v %CPU | head -n 1)
kill -9 $TOPPROCESS
echo system overloading!
echo Top-most process killed $TOPPROCESS
echo CPU USAGE is at $CPU_LOAD
else
fi
exit 0
sleep 1;
done
while [ 1 ]
me faz pensar em quanto CPU esse script sozinho consumirá. Além disso, três chamadaskill -9
em um script em execução constante? Isso me dá arrepios ...sleep 1
no laçoRespostas:
Eu estou supondo que o problema que você quer resolver é que você tem algum processo em execução em sua caixa que às vezes se comporta mal, e senta-se para sempre atrelar um núcleo.
A primeira coisa que você quer fazer é tentar consertar o programa que fica louco. Essa é de longe a melhor solução. Eu vou assumir que isso não é possível, ou você precisa de um kluge rápido para manter sua caixa funcionando até que seja consertada.
Você, no mínimo, deseja limitar seu script para atingir apenas o programa com o qual se preocupa. Seria melhor se as permissões limitassem seu script assim (por exemplo, seu script é executado como usuário X, a única outra coisa sendo executada como X é o programa).
Melhor ainda seria usar algo como
ulimit -t
para limitar a quantidade total de tempo de CPU que o programa pode usar. Da mesma forma, se consumir toda a memória, verifiqueulimit -v
. O kernel impõe esses limites; veja a página debash
manual (é um shell embutido) e a página desetrlimit(2)
manual para obter detalhes.Se o problema não é um processo que está ficando maluco, mas sim muitos processos em execução, implemente alguma forma de bloqueio para impedir que mais do que o X seja executado (ou - isso deve estar se familiarizando
ulimit -u
). Você também pode alterar a prioridade do agendador desses processos (usandonice
ourenice
) ou, ainda mais drástico,sched_setscheduler
para alterar a políticaSCHED_IDLE
.Se você precisar de ainda mais controle, dê uma olhada em grupos de controle (cgroups). Dependendo do kernel em execução, você pode realmente limitar a quantidade de tempo da CPU, memória, E / S, etc. que todo um grupo de processos consome juntos. Grupos de controle são bastante flexíveis; eles provavelmente podem fazer o que você está tentando fazer, sem kluges frágeis. O Arch Linux Wiki tem uma introdução aos cgroups que vale a pena ler, assim como a série de cgroups de Neil Brown no LWN.
fonte
Problemas:
-n
opção:sort -nrk 2
. Caso contrário, uma linha com um%CPU
valor de 5,0 acabará sendo maior que uma com um valor de 12,0.ps
implementação, convém usar a--no-headers
opção para se livrar dogrep -v
. Isso impede que você descarte comandos que contenhamPID
.echo CPU USAGE is at $CPU_LOAD
, você quis dizerecho CPU USAGE is at $CPU_USAGE
.exit 0
que você inseriu durante a depuração (?).Estilo:
CPU_USAGE_THRESHOLD=800
linha para o início do arquivo, pois essa é a coisa mais informativa e mais provável de ser alterada, mesmo após a estabilidade do script.-e
opção:ps -eo pid -eo pcpu -eo command
é o mesmo queps -eo pid -o pcpu -o command
(como estáps -eo pid,pcpu,command
).else
cláusula vazia . Isso sempre parece que deve ser tratado, mas não foi por algum motivo desconhecido.fonte
Eliminar processos que estão usando a maioria da CPU / memória está causando problemas: basta olhar para o que eles estão agora em sua máquina (aqui atualmente firefox, systemd (init), Xorg, gnome-terminal, um conjunto de threads do kernel, xemacs; nenhum dos quais é dispensável). Veja como ajustar o OOM-killer do Linux, por exemplo aqui .
Observe também que "memória usada pelo processo" é um conceito nebuloso, pois existem bibliotecas compartilhadas, executáveis são compartilhados e até partes de áreas de dados. Pode-se chegar a algum número cobrando a cada usuário uma fração do espaço usado, mas mesmo acrescentando isso não dá "memória usada" (menos ainda "memória liberada se o processo for interrompido", as partes compartilhadas permanecem atrás).
fonte
Criei um script, kill-process , que mata alguns processos listados em uma matriz, se o uso da CPU for maior que XX% por segundos YY ou matar processos com mais de ZZ segundos.
NOTA: Aqui está meu repositório no Github: https://github.com/padosoft/kill-process
Aqui está uma captura de tela:
Referências
Parte essencial do script (um resumo do código para o comando top):
Uso:fonte
sort
sersort -k9nr
. Semn
, receberá `5.9`>29.4
.