使用Shell脚本逐个启动应用程序

153次阅读
没有评论

问题描述

希望在系统启动后自动启动一系列应用程序,但这些应用程序需要按特定顺序启动,并且必须在前一个应用程序完成启动后再启动。他目前在终端中手动执行以下命令:

sudo docker-compose up
java -jar ./myapp.jar
python3 ./myapp.py
npm start ./myapp
chromium-browser www.my.app

因此,Java应用程序需要等待Docker容器启动完成,否则它将无法正常启动。类似地,Python应用程序需要等待Java应用程序启动完成,最后,Web页面需要在Angular前端准备就绪后才能打开。用户希望通过一个Shell脚本来处理这个问题,而不必深入使用DevOps工具。这只是一个小型的个人项目,他不想花太多时间在过度工程化上。

解决方案

使用Shell脚本来逐个启动这些应用程序,并在启动前进行必要的等待。您可以根据已有的Docker Compose文件,将Java、NodeJS和Python组件Docker化,然后通过Compose文件中的depends_on属性来指定启动顺序。最后,您可以使用docker-compose up命令以正确的顺序启动所有应用程序。

以下是解决方案的步骤:

  1. 创建一个Shell脚本,比如start_apps.sh
  2. 在脚本中逐个启动应用程序,并在启动前添加必要的等待。

以下是一个示例脚本:

#!/bin/bash

# 启动Docker容器
sudo docker-compose up -d

# 等待Docker容器启动完成
while ! docker ps | grep "your_container_name"; do
  sleep 1
done

# 启动Java应用程序
java -jar ./myapp.jar &

# 等待Java应用程序启动完成
while ! lsof -i :your_java_app_port; do
  sleep 1
done

# 启动Python应用程序
python3 ./myapp.py &

# 等待Python应用程序启动完成
while ! lsof -i :your_python_app_port; do
  sleep 1
done

# 启动NodeJS应用程序
npm start ./myapp &

# 等待NodeJS应用程序启动完成
while ! lsof -i :your_nodejs_app_port; do
  sleep 1
done

# 打开Web页面
chromium-browser www.my.app

# 等待Chromium浏览器关闭
wait

在上面的示例中,您需要将your_container_name替换为Docker容器的名称,your_java_app_port替换为Java应用程序的端口,your_python_app_port替换为Python应用程序的端口,以及your_nodejs_app_port替换为NodeJS应用程序的端口。

需要注意的是,这个解决方案在不使用过多DevOps工具的前提下,通过逐个启动应用程序并等待的方式来达到您的需求。然而,如果您的应用程序之间有更复杂的依赖关系,可能需要更复杂的脚本来管理它们的启动顺序和等待条件。

总结

使用Shell脚本,您可以逐个启动应用程序并等待它们的启动完成,以实现特定的启动顺序。这种方法适用于小型项目,无需过多涉及DevOps工具。但如果应用程序之间的依赖关系更为复杂,可能需要更高级的工具来管理启动顺序和条件等待。

正文完