목록에 파일이 없으면 루프가 실패합니다. 이 오류를 처리하는 방법은 다음과 같습니다.

목록에 파일이 없으면 루프가 실패합니다. 이 오류를 처리하는 방법은 다음과 같습니다.

디렉터리의 응용 프로그램을 반복하고 다시 시작이 완료된 후 시작하는 서버 다시 시작 시 실행되는 스크립트가 있습니다. 최근에 나는 애플리케이션 목록을 실행하기 위해 처음에는 텍스트 파일처럼 보이는 리팩토링을 수행했습니다. 목록을 사용할 수 없으면 모든 것이 시작됩니다.

#!/bin/bash

cd $HOME/services

startup()
{
    service=$(basename "$appName")

    #PLEASE NOTE: I've also tried this following if statement with [ -d $appName ] on the same line as [ -e $appName/bin/start.sh ] && [ $service != mongo ], with the same result.

    if [ -d $appName ]
    then
        if [ -e $appName/bin/start.sh ] && [ $service != mongo ];
        then
            cd $appName/bin
            echo "`date -u` - Stopping current instance of $appName"
            ./stop.sh $appName
            echo "`date -u` - Starting $appName"
            ./start.sh
        else
            echo "`date -u` - No start script found for $appName"
        fi
    else
        echo "`date -u` - Cannot find directory for $appName. Proceeding to next service in list"
    fi
}

cd $HOME/apps;

if [ -e $HOME/dependencies/list.txt ];
then
    echo "`date -u` - Reading from startlist.txt"
    while read appName; do
        startup $appName
    done <list.txt
    echo "`date -u` - Completed start up based on list"
else
    echo "`date -u` - Cannot find input list; starting all processes"
    for appName in $HOME/apps/* ; do
        startup $appName
    done
    echo "`date -u` - Completed startup for all processes"
fi

이 방법은 스크립트를 사용할 수 없거나 스크립트를 사용할 수 있는 경우에 작동합니다. 그러나 서비스가 목록에 없으면 실패합니다. 예를 들어 list.txt에 다음 콘텐츠가 있다고 가정합니다.

EmailServer
EmployeeProfiles
FakeApp
HAProxy

목록을 시작하면 EmailServer 및 EmployeeProfiles가 정상적으로 시작됩니다. FakeApp에 도달하면 해당 애플리케이션이 services/ 디렉터리에 존재하지 않는다는 메시지가 반환됩니다. 그러나 각 후속 서비스를 시작하는 대신 이 작업을 수행합니다.

답변1

목록에서 읽을 때 상대 경로를 사용하여 문제가 발생한 것 같습니다. 두 번째 appName을 읽을 때 작업 디렉터리가 여전히 첫 번째로 설정되어 [ -d $appName ]오류가 발생합니다.

가장 쉬운 수정은 아마도 startup $HOME/app/$appName대신 사용하는 것입니다 startup $appName.

관련 정보