リストにファイルがない場合、ループは失敗します。このエラーを処理する方法は次のとおりです。

リストにファイルがない場合、ループは失敗します。このエラーを処理する方法は次のとおりです。

ディレクトリ内のアプリケーションを繰り返し、再起動が完了した後に起動するサーバーの再起動時に実行されるスクリプトがあります。最近、私はアプリケーションリストを実行するために最初にテキストファイルのように見えるリファクタリングを行いました。リストが利用できない場合、すべてが開始されます。

#!/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

リストから読むときに相対パスを使用して問題が発生したようです。 2番目のappNameを読み取ると、作業ディレクトリがまだ最初に設定され、[ -d $appName ]エラーが発生します。

最も簡単な修正は、おそらくstartup $HOME/app/$appName代わりに使用することですstartup $appName

おすすめ記事