파일에 나열된 여러 프로세스 종료

파일에 나열된 여러 프로세스 종료

나열된 프로세스가 실행 중인지 여부를 파일에서 확인하고 그렇다면 해당 프로세스를 종료해야 하는 스크립트를 작성하려고 합니다.

파일에는 유사한 목록이 포함되어 있습니다.

process01:0
process02:0
process03:0
process04:0
process05:0

노트: 이러한 프로세스 중 일부는 이중 모드에서 실행되므로 나열된 프로세스 중 하나에는 2~3개의 다른 프로세스가 있습니다.

예:

user01@qhost0001:/home/user01>ps x
   PID TTY      STAT   TIME COMMAND
  3514 pts/2    S+     0:00 vim test_script.sh
  3844 pts/1    R+     0:00 ps x
 87844 pts/0    S+     0:00 -bash
100947 ?        S      0:00 sshd: user01@pts/1
100948 pts/1    Ss     0:00 -bash
101434 ?        S      0:00 sshd: user01@pts/2
101435 pts/2    Ss     0:00 -bash
127678 ?        S      0:00 process05 -c process05.cf
127869 ?        S      0:00 process01 -c process01.cf
127872 ?        S      0:00 process01 -c process01.cf
127879 ?        S      0:00 process03 -c process03.cf
127890 ?        S      0:00 process03 -c process03.cf
127904 ?        S      0:00 process03 -c process03.cf
128389 ?        S      0:00 process04 -c process04.cf

지금까지 작성한 스크립트는 다음과 같습니다.

#!/bin/bash

proc_name=$(awk -F':' '{ print $1 }' /app/config/process_failures.cf)
PID=$(ps -ef | grep "$proc_name" | grep -v grep | grep -v PID | awk '{print $2}')

test() {
for p in $proc_name
do
  ps -ux | grep $p > /dev/null

if [ $? -eq 0 ]; then
        echo "Process $p is runnning."
        echo "Killing the processes"
        pgrep -f $p | xargs kill -9
        else
                echo "Process $p not running."
        fi

done
}

main() {

echo $PID
#test
}

main

에코에 반환된 내용을 보면 파일 목록에 있는 것보다 더 많은 프로세스가 반환됩니다. 호스트 시스템에서 실행 중인 모든 프로세스를 보여줍니다. "ps -ux"로 변경하면 사용자가 실행 중인 모든 프로세스가 표시되지만 변수 내의 명령과 같은 다른 프로세스도 표시됩니다.

그래서 나는 내가 어디서 잘못되었는지 이해하지 못합니다. 누군가 내가 잘못 가고 있는 곳을 명확히 하는 데 도움을 줄 수 있습니까?

미리 감사드립니다

답변1

그래서 @White Owl의 도움으로 다음과 같은 해결책을 얻었습니다. 가까운 시일 내에 새로운 프로세스가 없을 것이라는 점을 알고 프로세스 목록 파일의 사용법을 변경했습니다. 그래서 스크립트에서 직접 프로세스 배열을 만들었습니다.

#!/bin/bash

processes=("main_mon" "sql_feed" "sql_intra" "sql_select" "topc" "iact" "isca" "iann" "dv2sql_so" "dv2sql_sorpc" "dv2sql_careo" "slamm" "slamm_mon" "dv2sql_socnt" "mmmtp" "ebus")

check_and_kill() {
for p in ${processes[@]};
do
  ps -ux | grep $p > /dev/null

if [ $? -ge 1 ]; then
        echo "Process $p is runnning."
        echo "Killing the processes"
        killall -s 9 -r $p -v
        else
                echo "No $p process is running."
        fi

done
}

main() {
check_and_kill
}

main

이것이 내가 찾은 해결책입니다. 감사해요

추신: 농담입니다. awk 또는 sed와의 관계는 Tom과 Jerry와 같습니다.

답변2

이름으로 종료할 프로세스를 정의하는 경우 표준 도구를 살펴봐야 합니다 killall.

따라서 모든 processXX를 종료하려면 다음과 같이 하면 됩니다.

killall -r "process[:digit:][:digit:]" --verbose

관련 정보