割り込みシェルのコマンドライン拡張

割り込みシェルのコマンドライン拡張

警告:意味を理解せずに、この質問に記載されているコマンドを試してはいけません。

重複したらすみません。コマンドがとてもシンプルで驚きました。

echo $(yes)

コンピュータが停止します。 (実際にはコンピュータが停止したのCtrlCではなくCtrlZ、ひどくレックがかかりますが、そのレックはコンピュータが死んだと思うのに十分です。)役に立たないようです。

一方、

ls /*/../*/../*/../*/../*/

コンピュータが最適なパフォーマンスよりも深刻に遅れ、最悪の場合にクラッシュを引き起こす可能性があるよく知られている脆弱性です。

このコマンドはよく知られているフォーク爆弾とは非常に異なります。

私の質問は次のとおりですシェルで実行を開始した直後に、これらのコマンドを中断して多数のシェルコマンドラインオプションをすぐに生成する方法はありますか?

私が理解したのは、コマンドが実行される前にシェル拡張が完了するため、遅延が発生したときにコマンドが実行されないため、コマンドを中断する一般的な方法が機能しないことです。しかし、私の理解が正しいことを確認したいと思います。そして、あまりにも多くのメモリを使用する前にシェル拡張をキャンセルする方法を知りたいです。

メモリ不足の状況でカーネルがどのように動作するか探していません。私はまた、SysRqシステムがすでに深刻に遅れているときに役立つ可能性がある過剰を探していません。また、ulimit記憶のような予防方法を探しているわけでもありません。システムが遅延する前に、シェル自体内で大規模なシェル拡張プロセスを効率的にキャンセルする方法を探しています。それが可能かどうかわかりません。コメントどおりに不可能な場合は、説明とともに回答を残してください。

一般的な回答が欲しかったので、元の質問にシステム関連情報を含めないことにしました。しかし、重要な場合に備えて、私のシステムに関する情報は次のとおりです。とをUbuntu 16.04.4 LTS使用してシステムを実行する。仮想マシンは関係ありません。gnome-terminalbash 4.3.48(1)x86_64

答え1

現時点ではGNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)仮想マシンを使用していません。

echo $(yes) 

シェルが存在し、システムが停止せず、次のことを行います。

ls /*/../*/../*/../*/../*/

返品

bash: /bin/ls: Argument list too long

ただし、通常、システム内のすべてのリソースを使用できるジョブを処理するときは、実行する前に制限を設定することをお勧めします。プロセスがCPU集約的であることがわかっている場合は、使用して起動またはcpulimit実行できますrenice

すでに起動されているプロセスを制限するには、PIDごとに1つずつ実行する必要がありますが、バッチスクリプトを使用すると、次のように実行できます。

#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract)   # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
    cpulimit -p $i -l 10 -z &   # to 10 percent processes
done

私の場合は、pypdfocrgreedyを起動してくださいtesseract

また、場合によっては、CPUが本当に良い場合は、renice次のように使用できます。

watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'

関連情報