모든 배열 멤버를 반복합니다.

모든 배열 멤버를 반복합니다.

나는 최근에 스크립팅을 가지고 놀았습니다. @Cas의 도움으로 이것을 썼습니다.

#!/bin/bash


## Variables ##

host="`/bin/hostname`";


    ## Limits ##

OneMin="1";
FiveMin="6";
FifteenMin="6";

    ## Mail IDs ##

To="[email protected], [email protected]";
Fr="root@"$host;


    ## Load Averages ##

LA=(`uptime | grep -Eo '[0-9]+\.[0-9]+' | cut -d"." -f1`)


    ## Top Process List ##

tp=(`ps -ef | sort -nrk 3,3 | grep -E "(php|httpd)" | grep -v root | head -n30 | awk '{print $2}'`)


## Actions ##

if [ ${LA[0]} -ge $OneMin ]; then


    ## Send Mail ##

echo -e "From: $Fr
To: $To
Subject: *ALERT* - Current Load on '$host' Is High
Load Averages Are:  \n\n
1:Min\t5:Min\t15:Min   \n
${LA[0]}\t${LA[1]}\t${LA[2]}  \n\n

List Of Processes That Were Killed \n" | sendmail -t


    ## Kill Top Pocesses ##


for i in $tp ; do
    kill -9 $i
done



fi

배열이 유효한지 확실하지 않습니다. 특히 최상위 프로세스를 종료하기 위해 루프를 추가한 마지막 부분은 해당 이메일의 프로세스 목록을 인쇄하지 않기 때문입니다. 이유는 모르겠습니다. 하지만 스크립트에는 오류가 발생하지 않습니다.

확인##해결책##

그런데 이게 먹힐까요?

#!/bin/bash


## Variables ##

host="`/bin/hostname`";


    ## Limits ##

OneMin="7";
FiveMin="6";
FifteenMin="6";


    ## Load Averages ##

LA=(`uptime | grep -Eo '[0-9]+\.[0-9]+' | cut -d"." -f1`)



## Actions ##


    ## One Minut Action ##

if [ ${LA[0]} -ge $OneMin ]; then


    ## Send Mail ##

echo -e "From: $Fr
To: $To
Subject: *ALERT* - Current Load on '$host' Is High
Load Averages Are:  \n\n
1:Min\t5:Min\t15:Min   \n
${LA[0]}\t${LA[1]}\t${LA[2]}  \n\n

List Of Processes That Were Killed \n
`ps -ef | sort -nrk 3,3 | grep -E "(php|httpd)" | grep -v root | head -n30 | awk '{print $2}'`" | sendmail -t


    ## Kill Top Pocesses ##


for i in `ps -ef | sort -nrk 3,3 | grep -E "(php|httpd)" | grep -v root | head -n30 | awk '{print $2}'` ; do
    kill -9 $i
done


fi

내 말은 이것이 모든 PiD를 죽일 것인가?

답변1

문제는 tp=(...배열이 정의되었지만 $tp배열의 첫 번째 요소만 참조된다는 것입니다.

당신은해야합니다

for i in "${tp[@]}" ; do

관련 정보