![如果列表中的文件不存在则循环失败;如何处理这个错误](https://linux22.com/image/168344/%E5%A6%82%E6%9E%9C%E5%88%97%E8%A1%A8%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%8D%E5%AD%98%E5%9C%A8%E5%88%99%E5%BE%AA%E7%8E%AF%E5%A4%B1%E8%B4%A5%EF%BC%9B%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E8%BF%99%E4%B8%AA%E9%94%99%E8%AF%AF.png)
我有在服务器重新启动时运行的脚本,用于循环遍历目录下的应用程序并在重新启动完成后启动它们。最近,我进行了一次重构,首先看起来是一个文本文件,以便启动应用程序列表。如果列表不可用,它将启动一切:
#!/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
.