PID를 종료하는 스크립트를 어떻게 작성합니까(If else 루프)? [폐쇄]

PID를 종료하는 스크립트를 어떻게 작성합니까(If else 루프)? [폐쇄]

아래와 같이 여러 PID가 포함된 파일이 있습니다.

#cat /scripts/pid.txt
12345
23456
34567
45678

위 파일에서 PID를 하나씩 읽고 종료하는 스크립트를 작성해야 합니다. 스크립트가 중단되고 PID가 종료되지 않으면 스크립트가 종료되고 다음 PID 종료를 진행해야 합니다.

이것은 내 스크립트입니다.

filename_java=/scripts/pid.txt
cat ${filename_java} | while read line
do

echo "The $line PID is still running" >> 
$TC_LOGS/killing_pid_aftershutdown_$DATE.txt
echo "killing the PID $line " >> 
$TC_LOGS/killing_pid_aftershutdown_java_$DATE.txt
kill -15 $line && sleep 5
mail -s "Admin console is shutdown gracefully" -r $LOGNAME@$HOSTNAME <email 
id> < /dev/null

done

PID를 하나씩 읽기 전에 파일에 해당 PID가 있는지 확인해야 합니다. 그렇다면 종료하지 않으면 해당 PID를 종료하고 종료해야 합니다.

Santosh G님, 감사합니다.

답변1

사소한 수준에서는 이것이 왜 충분하지 않은지 완전히 확신하지 못합니다.

[[ -s "/scripts/pid_$DATE.txt" ]] && kill $(cat "/scripts/pid_$DATE.txt")

아니면 첫 번째 사람을 죽이고 나머지는 그대로 두어야 합니까?

if [[ -s "/scripts/pid_$DATE.txt" ]] 
then
    while IFS= read -r pid
    do
        kill "$pid" && break
    done <"$scripts/pid_$DATE.txt"
fi

두 경우 모두 스크립트에 대상 프로세스에 신호를 보낼 수 있는 충분한 권한이 있고 파일 "$scripts/pid_$DATE.txt"이 존재하지 않거나 신뢰할 수 있고 최신 파일이라고 가정합니다.

답변2

확실하지는 않지만 "kill"은 막히지 않으므로

while read pid; do kill "$pid"; done < "/scripts/pid_$DATE.txt"

또는 프로세스를 폭력적으로 종료하려면 kill에 -9를 추가하세요.

답변3

다른 답변은 귀하가 해야 할 일을 보여 주지만 실제로 귀하의 질문에 대답하지는 않습니다. 그래서 그게 다입니다.

pid가 존재하는지 확인하려면 ps p $pid반환 코드를 실행하고 확인하세요.

그래서 당신은 이것을 할 수 있습니다 :

if ps p $pid; then
    kill $pid
fi

또는

ps p $pid && kill $pid

파일 읽기:

while IFS= read -r pid
do
    ps p $pid && kill "$pid"
done < "/scripts/pid_$DATE.txt"

또는 xargs루프 대신 사용하십시오.

xargs -a "/scripts/pid_$DATE.txt" -I{} sh -c '
    ps p $1 > /dev/null 2>&1 && kill $1
' xargs-sh {}

다른 사람들이 지적했듯이, kill당신이 갇힐 수 있는 전제가 잘못되었기 때문에 이 모든 것은 불필요합니다.

관련 정보