我正在制作一个脚本来在服务器重新启动时启动许多服务。为此,我循环遍历目录,检查每个目录是否都有 start.sh 脚本,如果有,则调用该脚本。但是,作为其中的一部分,我想设置脚本来忽略它具有选择名称的服务,在本例中为 mongo:
for service in $HOME/start/* ; do
if [ -e $HOME/start/$service/start.sh ] && [ $service != mongo ]
then
cd $HOME/start/$service
./start.sh
else
pwd
echo "No start script found for $service"
fi
done
这是因为 mongo 在调用此循环之前启动,作为服务的前提条件,并且您一次不能拥有多个它的实例。然而,它继续循环并调用 mongo。我怎样才能让它忽略这一点?
编辑:更正 appName 为 service
答案1
当您使用 glob 迭代文件时,路径将被添加到文件中。因此,如果您的文件只是mongo
(它应该基于您的代码,如果不是,那也是一个问题),您的循环将设置service
为/home/<YOUR USER>/start/mongo
.然后你试图看看它是否不等于mongo
它不等于。您可以使用以下方法basename
来修复该问题:
for s in "$HOME/start/"*
do
service=$(basename "$s")
if [ -f "$HOME/test/$service/start.sh" ] && [ "$service" != mongo ]
then
cd "$HOME/start/$service"
./start.sh
else
pwd
echo "No start script found for $service"
fi
done
答案2
对于“扩展通配/扩展模式匹配”可能是一个有趣的案例 - 如果您的 shell ( bash
?) 提供了:
$ shopt -s extglob
$ for s in "$HOME/start/"!(mongo); do echo $s; done
答案3
不要这样做!使用该机器在您的发行版中启动服务(大概systemd
是今天的 Linux;其他 Unixy 系统有自己可爱的怪癖......)。然后使用发行版的机制来启用/禁用服务启动。
您的发行版文档应该提供详细信息。如果您从发行版的软件包安装该服务,这应该会自动处理。那就是非常高度建议:发行版(实际上:其中包的维护者)将确保安装正确完成,安全配置,并密切关注错误报告(以及潜在的安全风险,如果是某种类型的问题,则需要考虑这一点)服务器,暴露于来自世界各地的各种恶棍)。