-5
#! /bin/bash
#
# clear_ram.sh - Clear as much user-space ram as possible 
#                       (until the OOM_killer gets us)
#

       swapoff -a
       mem=$(free -b | grep Mem | awk '{print $2}')
       mount none -t tmpfs -o size=$mem /tmp
       dd if=/dev/zero of=/tmp/zero.dat bs=1M &
       echo "17" > /proc/$(pidof dd)/oomadj
       while (pidof dd); do kill -USR1 $(pidof dd); done

これはシェルスクリプトです。このコードは何をしますか?

宿題ではない

4

1 に答える 1

3

このスクリプト

  • スワップを無効にします
  • RAMの量をバイト単位で取得します
  • 使用可能なRAMと等しいRAMディスクをマウントします
  • ddを介してRAMディスクにゼロを書き込みます
  • ddプロセスをメモリ不足キラーのチョッピングブロックの最初に設定しようとします
  • dd実行を続ける限り、のプロセスIDとその現在のステータスを出力します

少なくとも最近のカーネルでは、書き込みではoom_adjなく書き込みを行う必要があり、最大値が17ではなく15であるため、「試行」と言います。oomadj

スクリプト内のものだけでなく、実行中のすべてのPIDとステータスが出力されるため、ここにもバグがあります。dd

コメントが言うように、最終的にカーネルのメモリ不足キラーはプロセスを強制終了します。

私はそれが愚かなことだとかなり確信しています。この方法で実際にメモリをゼロにする必要がある理由はわかりません。

于 2012-06-22T18:42:52.783 に答える