컨텍스트: 메모리가 매우 낮은 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 *pid
pid 파일 목록을 가져온 다음 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