AIX - フォークが不可能な場合のksh組み込み機能を使用したメモリーの確保

AIX - フォークが不可能な場合のksh組み込み機能を使用したメモリーの確保

コンテキスト:メモリーが非常に低いAIX lpar(ポーキングが不可能なため、シェルの組み込みコマンド(cd、echo、kill)のみが機能します)。 (hmc)コンソールを持つことができますが、メモリーが低すぎて「ps -ef」を実行できない場合は、AIXでメモリーを解放するためのより良い方法が必要です。 (方法はありますが、既存のPIDをランダムに殺す方法です。

私は知りたいです:

  • どうやって見ることができますか?コンテンツksh 組み込み関数のみを使用するファイル数
  • 最終目標:組み込み機能のみを使用してファイルの内容を表示し、どのPIDを殺すかを選択して「正常」プロセスのみを殺すことができます。 (PIDを十分に殺すと「ps -ef」を使用できます。)「netstat -rn」など、「ps」はまだ「重要」プロセスを表示する必要があります。

私がすでに知っていること:

  • コンソールにログインできます(ssh user@hmc、vtmenu、OutOfMemory問題のあるlparを選択してrootとしてログインすると、しばらくして(2〜5分)、kshがコマンドを分岐できないことが表示されます。/ etc /で苦情を申し立てる設定ファイルに(ksh)プロンプトが表示されます。

  • 「ls」をシミュレートして、/proc/PID# ディレクトリに何があるかを確認できます。cd /proc ; echo * まだ実行中のPIDのリストを取得できます。 (通常は終了しない0、1(init)と実行中のプロセス(ksh?syncd?ls?java?)をほとんど示さない他のPID全体が表示されます。

  • また:十分なメモリを確保することができます kill some pids here(killはksh(またはbash!)に組み込まれている機能なので、使用するために分岐する必要はありません)。十分なPIDを終了すると、他の操作を実行できますps -ef netstat -rn。 lpar自体からサーバーを再起動する前に、サーバーの状態を取得しますshutdown -rF(同期、ファイルシステムのクローズなど)。 「追加しない限り、代替(HMCで再起動)は通常不可能です(一部のコマンドを分岐しようとする可能性があるため)。 lparを再起動すると、fsckが非常に長くなる可能性があるため、お勧めできません。

  • 一部のPIDをシャットダウンしてシャットダウンを実行する:実行中のアイテムと再起動する必要があるアイテムのアイデアを取得し、パスを取得し(静的パスが一致しない場合)、「よりエレガントに」シャットダウンできます。ファイルシステムを保存し、起動時にfsckに時間がかからないようにしてください。 )

しかし、私はまだあなたの助けが必要です:

  • 一部のファイルの内容を確認してください! (例:/var/run/*.pidでいくつかのpidファイルのpidを表示するにcd /var/runecho *pidファイルの1つの内容をどのように取得できますか?同じトリックを使用すると、/ proc / PID#/ ...からいくつかの情報を取得できます。

  • 上記の方法(または利用可能なトリック)を使用して「賢く」PIDを選択してください。

精度:このバージョンのksh組み込み機能でトリックが機能すると、ボーナスポイントがあります。

prompt# strings /usr/bin/ksh | grep '\..*\.' | grep builtin
0@(#)27  1.57.14.5  src/bos/usr/bin/ksh/builtin.c, cmdksh, bos61Z, z2013_29A2 7/5/13 00:10:52

答え1

これを試してみてください:

kshに含まれる組み込み関数のリスト:

$ ksh -c 'builtin' 

あなたの質問に答えるのに役立つ唯一の組み込み機能は次のとおりです。

echo kill print printf read

したがって、「ファイルを読む」唯一の方法は読み取りを使用するようです。
いくつかの機能を定義しましょう(CLIからコピーして貼り付けます)。

function Usage {
    echo "fileread: filename [from line] [to line]"
    exit 1
}

function fileread {
    [ "$#" -lt 1 ] && echo "please supply the name of a file" && Usage
    linestart=${2:-1}
    lineend=${3:-0}
    i=0
    while IFS=$'\n' read line; do
        i=$((i+1))
        [[ "$i" -lt "$linestart" ]] && continue
        [[ "$lineend" != 0 && "$i" -gt "$lineend" ]] && continue
        echo "$i $line"
    done <"$1"
}

次に(例えば)関数を呼び出します。

$ cd /var/run
$ fileread sshd.pid 10 20

関連情報