나열된 프로세스가 실행 중인지 여부를 파일에서 확인하고 그렇다면 해당 프로세스를 종료해야 하는 스크립트를 작성하려고 합니다.
파일에는 유사한 목록이 포함되어 있습니다.
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