"restart.sh" 스크립트를 실행하는 데 문제가 있습니다. 주요 목표는 ID로 프로세스를 종료한 다음 프로세스를 다시 시작하는 것입니다.
프로세스 이름에는 아래와 같이 "DND"가 있습니다.
$ ps -ef | grep DND
root 18425 1 60 11:53 pts/0 00:40:34 java -jar DND_Retry.xml
참고: PID는 스크립트가 실행될 때마다 변경됩니다.
1 스크립트의 일부는 다음과 같습니다.
echo "Killing BND Process"
pids=$(pgrep -f BND)
for pid in "${pids}"; do
if [[ $pid != $$ ]]; then
kill -2 "$pid"
fi
done
sleep 2
while true
do
shut1=`more /Data/v3/nohup_bnd.out | grep "has been shutdown" | wc -l`
if [ $shut1 -eq 1 ]; then
echo "process ended now restart"
문제는 스크립트가 처음에는 성공적으로 실행되지만 다시 실행하면 프로세스가 종료되지 않는다는 것입니다. 그러나 Kill -9를 사용하여 프로세스를 수동으로 종료한 다음 스크립트를 다시 실행하면 성공적으로 실행되어 원하는 결과가 생성됩니다.
위 스크립트/조건에서 수정해야 할 사항이 있나요? Kill -2를 수행해야 합니다.
답변1
여러 PID를 실행 중인 경우 인용된 변수로 "${pids}"
인해 문제가 발생할 수 있습니다. 따옴표를 제거해야 합니다.
예:
$ pids=$(pgrep -f a_program_started_three_times)
$ for pid in "$pids"; do echo "pid is $pid"; done
pid is 563
564
565
$ for pid in $pids; do echo "pid is $pid"; done
pid is 563
pid is 564
pid is 565
임의로 선택할 수 있는:
for 루프에 추가 검사를 추가하겠습니다.
pids=$(pgrep -f BND)
# if pid(s) were found, then...
if [ $? -eq 0 ]; then
# removed the quotes from "${pids}" here
for pid in $pids; do
if [[ $pid != $$ ]]; then
kill -2 "$pid"
fi
done
fi