inotifywait 스크립트는 파일을 무기한 감시하고 프로세스를 다시 시작합니다. 조언이 필요합니다.

inotifywait 스크립트는 파일을 무기한 감시하고 프로세스를 다시 시작합니다. 조언이 필요합니다.

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 "$@"

내가 뭘 잘못했나요?

관련 정보