Aviso: NÃO tente os comandos listados nesta pergunta sem saber suas implicações.
Desculpe se isso é uma duplicata. Estou surpreso ao saber que um comando tão simples quanto
echo $(yes)
congela meu computador (na verdade, está deixando o computador muito lento, em vez de congelar, mas o atraso é ruim o suficiente para fazer alguém pensar que ele congelou). Digitar CtrlCou CtrlZlogo após digitar este comando não parece me ajudar a recuperar desse comando digitado incorretamente.
Por outro lado
ls /*/../*/../*/../*/../*/
é uma vulnerabilidade bem conhecida que também atrasa muito o computador para o melhor e trava o computador para o pior.
Observe que esses comandos são bem diferentes das conhecidas bombas fork.
Minha pergunta é: Existe uma maneira de interromper esses comandos que acumulam uma grande quantidade de opções de linha de comando do shell imediatamente após eu começar a executá-los no shell?
Meu entendimento é que, como a expansão do shell é feita antes da execução do comando, a maneira usual de interromper um comando não funciona porque o comando nem está em execução quando ocorre o atraso, mas também quero confirmar que meu entendimento está correto e Estou extremamente interessado em aprender alguma maneira de cancelar a expansão do shell antes que ela use muita memória.
Não estou procurando como o kernel funciona com pouca memória. Também não estou procurando SysRq
exageros que possam ser úteis quando o sistema já está terrivelmente atrasado. Também não estou procurando abordagens preventivas como impor um ulimit
na memória. Estou procurando uma maneira que possa efetivamente cancelar um enorme processo de expansão do shell de dentro do próprio shell antes que ele atrase o sistema. Não sei se é possível. Se for impossível conforme comentado, por favor, deixe também uma resposta indicando isso, de preferência com explicações.
Optei por não incluir nenhuma informação específica do sistema na pergunta original porque quero uma resposta geral, mas caso isso seja importante, aqui estão as informações sobre meu sistema: Ubuntu 16.04.4 LTS
com gnome-terminal
e bash 4.3.48(1)
, executando um x86_64
sistema. Nenhuma máquina virtual envolvida.
A partir de
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
e não estou usando uma VM:existe o shell e não congela o sistema, e:
retorna
Mas, como regra, quando você lida com algo que pode obter todos os recursos de um sistema, é melhor definir limites antes de executar, se você souber que um processo pode ser um devorador de CPU, você pode iniciá-lo
cpulimit
ou executá -lorenice
.Se você quiser limitar os processos que já estão iniciados, você terá que fazer um a um por PID, mas pode ter um script em lote para fazer isso como o abaixo:
No meu caso
pypdfocr
lança o gulosotesseract
.Além disso, em alguns casos em que sua CPU é muito boa, você pode usar um
renice
assim: