아래와 같이 여러 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
당신이 갇힐 수 있는 전제가 잘못되었기 때문에 이 모든 것은 불필요합니다.