AIX - use ksh builtins para liberar memória quando o fork não for possível

2

Contexto: um AIXlpar com memória muito baixa (nenhum bifurcação é possível, portanto somente os builtins do shell (cd, echo, kill) funcionarão). Eu posso ter um console (hmc) para ele, mas eu preciso de uma maneira melhor de começar a liberar memória no AIX, quando a memória é muito baixa para permitir que você faça um "ps -ef". (Eu tenho uma maneira, mas é uma maneira de matar aleatoriamente pids existentes. Eu preciso ter mais informações sobre o PID eu posso matar, para que eu possa escolher um PID sem importância)

Eu quero saber:

  • Como posso ver o conteúdo de arquivos usando apenas ksh 'builtins
  • e o objetivo final: qual conteúdo do arquivo eu poderia olhar, usando apenas builtins, para escolher os pids para matar, para que eu apenas mate o processo "mundano" (quando eu matei PIDs suficientes, então poderei "ps -ef" "netstat -rn" etc, e "ps" ainda deve mostrar os processos "importantes"

O que eu já sei:

  • Eu posso logar no console (ssh hscroot @ hmc, vtmenu, escolher o lpar com problemas OutOfMemory, logar como root, e depois de um tempo (2-5 minutos) e várias reclamações que o ksh não pode comandos fork em / etc / profile, chego a um prompt (ksh).

  • Agora posso simular "ls" para ver o diretório / proc / PID #: cd /proc ; echo * me dará a lista de PIDs ainda em execução. (normalmente vejo 0, 1 (init), que não devem ser eliminados, e também um monte de outros PIDs, com pouca indicação de qual processo eles executam (ksh? syncd? ls? java?).

  • Eu também posso: kill some pids here para liberar memória o suficiente (kill é um embutido no ksh (ou bash!), então não há necessidade de bifurcar para usá-lo) e quando eu matei PIDs suficientes, então eu sou capaz para então fazer um ps -ef netstat -rn etc, permitindo-me obter o estado do servidor antes de eu shutdown -rF reinicializá-lo a partir do próprio lpar (Isto irá sincronizar, fechar sistemas de arquivos, etc. Note que a alternativa, uma reinicialização a partir do HMC, geralmente não é possível (como provavelmente tenta bifurcar alguns comandos), a menos que você adicione "--immed", que é como desligar diretamente e não é aconselhável, pois pode causar problemas no sistema de arquivos, causando fsck por vezes muito demorado ao reiniciar o lpar).

  • matando alguns PIDs e executando o shutdown: permita-me obter algumas idéias de "ps -ef" do que estava rodando e precisa reiniciar, pegar as rotas (caso as rotas estáticas não combinem), e shutdown "more graciosamente ", preservando o sistema de arquivos e evitando fsck demorado quando ele é iniciado.)

Mas preciso da sua ajuda também para:

  • Veja o conteúdo de alguns arquivos! (por ex: para poder ver o pid de alguns dos arquivos pid em /var/run/*.pid, eu faria: cd /var/run e, em seguida, echo *pid para obter a lista de arquivos pid, mas então , com apenas builtins de ksh (lembre-se: não forking!) como posso obter o conteúdo de um desses arquivos?). O mesmo truque também poderia ajudar a obter algumas informações sob / proc / PID # / ..., talvez me permitindo também escolher o PID correto para matar)

  • escolha PIDs "sabiamente" usando o acima (ou qualquer truque que você possa ter)

Precisão: Pontos de bônus se o seu truque funciona com esta versão do ksh builtins:

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
    
por Olivier Dulac 20.10.2016 / 18:00

1 resposta

2

Por favor, tente isto:

De uma lista de builtins incluídos no ksh:

$ ksh -c 'builtin' 

Estes são os únicos recursos internos úteis para responder à sua pergunta:

echo kill print printf read

Portanto, parece que a única maneira de "ler um arquivo" é usar a leitura.
Vamos definir algumas funções (copiar e colar na 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"
}

E depois, chame a função (como um exemplo):

$ cd /var/run
$ fileread sshd.pid 10 20
    
por 20.10.2016 / 20:08