Inotify를 사용하여 애플리케이션 구성 파일을 작성할 때 프로세스를 다시 시작하는 스크립트를 작성하려고 합니다. 스크립트는 실행 중인 호스트에 따라 다르게 작동해야 합니다. "기본" 서버에서 실행 중인 경우 스크립트는 프로세스를 다시 시작하고 파일을 다른 "보조" 호스트로 scp해야 합니다. "보조" 서버에서 실행 중인 경우 프로세스를 다시 시작해야 합니다.
백그라운드에서 스크립트를 실행 중인데 잠시 후 스크립트 프로세스가 종료되고 보조 호스트에서 스크립트가 프로세스를 다시 시작하여 한 번이 아닌 여러 번 실행되는 것을 확인했습니다.
#!/bin/bash
# Script to watch APP application file for write changes.
# If APP is written to and saved, on server0, restart APP and check if its running.
# Then push to other servers with userone account.
# If not on server0, push simply restart APP.
declare -a APP_HOSTS=("server0" "server1" "server3" "pushserver0" "pushserver1" "pushserver3" "vumitest")
declare -a my_needed_commands=("/opt/APP/conf/application.conf" "inotifywait" "service")
HOSTNAME=$(hostname -s)
missing_commands()
{
local missing_counter=0
for needed_command in "${my_needed_commands[@]}"; do
if ! command -v "$needed_command" >/dev/null 2>&1; then
printf "Command not found in PATH: %s\n" "$needed_command" >&2
((missing_counter++))
fi
done
if ((missing_counter > 0)); then
printf "Minimum %d commands are missing in the PATH, aborting.\n" "$missing_counter" >&2
exit 1
fi
}
restart_and_scp()
{
local host_count=0
local restofthem=("${APP_HOSTS[@]}")
unset restofthem[0]
if service APP restart >/dev/null 2>&1; then
for each in "${restofthem[@]}"; do
scp -Cqv "${my_needed_commands[0]}" userone@"$each":/opt/APP/conf >/dev/null 2>&1
((host_count++))
if [ host_count -eq "${#restofthem[@]}" ]; then
break
fi
done
fi
}
restart_APP()
{
service APP restart >/dev/null 2>&1
}
prime_watch()
{
inotifywait -mrq -e close_write "${my_needed_commands[0]}" | \
while read filename; do restart_and_scp; done
}
other_watch()
{
inotifywait -mrq -e modify "${my_needed_commands[0]}" | \
while read filename; do restart_APP; done
}
setup_watch()
{
if [ ! -z "$1" ]; then
prime_watch
else
other_watch
fi
}
main()
{
if [[ "${APP_HOSTS[0]}" =~ "${HOSTNAME}" ]]; then
setup_watch prime
else
setup_watch
fi
exit
}
main "$@"
내가 뭘 잘못했나요?