シェルスクリプトは、特定の条件を満たすプロセスを自動的に終了します。

シェルスクリプトは、特定の条件を満たすプロセスを自動的に終了します。

実行時にtop複数のプロセスを表示する 'perl'コマンドのCPU使用率は100%に近いです。

    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 21287  simon      15   0  4141  231 5891 S  90.3  0.0  14:27.50 perl
 22545 albert      15   0 12744 1172 8321 S  99.0  0.0  20:00.58 perl
        ...
        ...

lsof -p <pid>悪意のあるプロセスかどうかを推定します(通常、パイプラインのどこかでローカルポート> 50000を使用して外部IPアドレスに接続しようとします)。

kill -9 <pid>該当する悪意のあるプロセスを個別に終了します。

その後、上記の操作を繰り返します。

理想的には、次のプロセスを自動的に終了したいと思います。

  • 上記のユーザー
  • 15分以上実行中
  • CPU使用率が90%を超えています。
  • アウトバウンドTCP接続があります(可能な場合)。

もし便利なスクリプトを持っている人がいますか?ありがとうございます!

答え1

実際には便利なスクリプトはありませんが、これらの悪意のあるプロセスを終了しても最初に発生した問題は解決されません。あなたはWebホストであり、これらはあなたのVPSで実行されている鉱山労働者ですか?

それらを殺す代わりにできることは、「Starve Them」を使用することです。cgroup

これにはCPUとネットワークアカウントと呼ばれるツールがありますcgclassify。柔軟な階層を構築できます。 CentOS/RHELには良いドキュメントがあります。ここ

私は詳細の専門家ではありませんが、次の方法が可能だと思います。 CPU/メモリ/ネットワーク用のcgroupを作成し、cgclassifyまたはメンションデーモンを使用して、使用された共有に基づいてプロセスを分類します。これは、デーモンがリソース使用量の監視を担当し、ネットワークと一定量のCPU共有を使用するプロセスをcgroupに移動できることを意味します。これはCPUとネットワークアクセスを厳しく制限するか、プロセスを直接終了します(たとえば、次の理由で)。メモリ不足)。

プレゼンテーションですいくつかの詳細

15分ごとにこれらのプロセスを終了する問題は、そのプロセスがすぐに再作成され、その15分間にすべてのリソースが消費されることです。

cgroupを使用すると、特定のセキュリティバイナリ(PHP、Apacheなど)を分類し、他のすべてのプロセスを制限できます。したがって、CPU/ネットワーク使用量はサーバーに影響を与えず、ユーザーがジョブを実行する価値がないほど遅くなります。プロセスがより多くのCPUを使用するほど、速度が遅くなるようにCPU共有を調整することもできます。ネットワーク帯域幅も同様です。発信ネットワーク接続には1Mbitのみを使用するか、それ以下にユーザーごとのすべてのプロセスを制限できます。

cgroupのアカウントデータのみを使用してプロセスを終了することもできます。

このタスクを「すぐに」実行することは別の問題のように見えますが、問題が続く場合は使用と修正を検討してください。ulatencydまたはあなたの要件を満たす同様のツール。良いルールを使用すると、問題のあるプロセスを15分以内にある程度持続し、より迅速に処理できます。

関連情報