AIX - 포크가 불가능할 때 ksh 내장 기능을 사용하여 메모리 확보

AIX - 포크가 불가능할 때 ksh 내장 기능을 사용하여 메모리 확보

컨텍스트: 메모리가 매우 낮은 AIX lpar(포킹이 불가능하므로 쉘의 내장 명령(cd, echo, kill)만 작동함). (hmc) 콘솔을 가질 수도 있지만, 메모리가 너무 낮아서 "ps -ef"를 수행할 수도 없을 때 AIX에서 메모리 해제를 시작하는 더 좋은 방법이 필요합니다. (방법이 있지만 기존 PID를 무작위로 죽이는 방법입니다. 죽일 수 있는 PID에 대한 더 많은 정보가 필요하므로 중요하지 않은 것을 선택할 수 있습니다)

나는 알고 싶다:

  • 어떻게 볼 수 있어?콘텐츠ksh 내장 함수만 사용하는 파일 수
  • 최종 목표: 내장된 기능만 사용하여 어떤 파일의 내용을 볼 수 있고 어떤 PID를 죽일지 선택하여 "정상" 프로세스만 죽일 수 있습니다. (PID를 충분히 죽이면 "ps -ef"를 사용할 수 있습니다.) "netstat -rn" 등, "ps"는 ​​여전히 "중요" 프로세스를 표시해야 합니다.

내가 이미 알고 있는 것:

  • 콘솔에 로그인할 수 있습니다(ssh user@hmc, vtmenu, OutOfMemory 문제가 있는 lpar을 선택하고 루트로 로그인하면 잠시 후(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에서 다시 시작)은 일반적으로 불가능합니다(일부 명령을 분기하려고 시도할 수 있으므로). --immed"는 전원을 직접 끄는 것과 비슷하지만 파일 시스템 문제를 일으킬 수 있고 때로는 lpar를 다시 시작할 때 fsck가 매우 길어질 수 있으므로 권장되지 않습니다.

  • 일부 PID를 종료하고 종료 실행: 실행 중인 항목과 다시 시작해야 하는 항목에 대한 아이디어를 얻고 경로를 얻은 다음(정적 경로가 일치하지 않는 경우) "더 우아하게" 종료할 수 있습니다. 파일 시스템을 보존하고 시작 시 fsck 시간이 오래 걸리지 않도록 하세요. )

하지만 난 여전히 네 도움이 필요해:

  • 일부 파일의 내용을 확인해보세요! (예: /var/run/*.pid에서 일부 pid 파일의 pid를 보려면 다음을 수행합니다. cd /var/run그런 다음 echo *pidpid 파일 목록을 가져온 다음 ksh의 내장 기능을 사용합니다(기억: Cross 분할을 비활성화합니다! ) 이 파일 중 하나의 내용을 어떻게 얻을 수 있나요? 동일한 트릭을 사용하면 /proc/PID#/...에서 일부 정보를 얻는 데 도움이 될 수 있으며 종료할 올바른 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

관련 정보