优化后的版本

docker_operations.sh

复制代码
#!/bin/bash
 
# all definition
NETWORK_NAME="net-1"
VOLUME_MOUNT="-v /home/norten/Public/tools:/mnt" # 容器内部挂载到主机的路径
LOG_ROUTE="/home" # .log 生成的所在的路径
SCRIPT_ROUTE="/mnt/container_run_medium.sh" #模拟程序所在文件路径
IMAGE_NAME="ubuntu"
 
# View help command
function help_container() {
    echo " Usage: ./docker_operations.sh start 1 10"
    echo " "
    echo " create [num] "
    echo " start [start_num] [end_num] "
    echo " exec [start_num] [end_num] "
    echo " entry [num] "
    echo " stop [start_num] [end_num] "
    echo " remove [num] " 
    echo " info [num]"
    echo " check [start_num] [end_num]"
    echo " "
    echo " Usage: exit "
    echo " exit <exit the container>"
    echo " docker ps  <view all running containers>"
    echo " docker ps -a  <view all containers>"
    echo " "
}
 
# Dynamic container creation
function create_container() {
    echo "create zero paremeter is: $0"  
    echo "create first paremeter is: $1"
    echo "create second paremeter is: $2"  
 
    local num="$1"
    local CONTAINER_IP="192.168.0.$((num+60))"
    echo "IP IS $CONTAINER_IP"
    local CONTAINER_NAME="container-$num"
 
    # Check whether the IP address is already in use
    local existing_ips=($(docker inspect --format='{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) 2>/dev/null))
    for ip in "${existing_ips[@]}"; do
        if [[ "$ip" == "$CONTAINER_IP" ]]; then
            echo "Error: IP Address $CONTAINER_IP is already in use by another container."
            exit 1
        fi
    done  
 
    # Trying to create a container
    docker run -itd \
        --name "$CONTAINER_NAME" \
        --network="$NETWORK_NAME" \
        --ip="$CONTAINER_IP" \
        $VOLUME_MOUNT \
        $IMAGE_NAME \
    && echo "Container $CONTAINER_NAME created with IP $CONTAINER_IP." \
    || { echo "Failed to create container $CONTAINER_NAME."; exit 1; }
 
}
 
# Start specified or a range of containers
function start_container() {
    echo "start zero paremeter is: $0"  
    echo "start first paremeter is: $1"
    echo "start second paremeter is: $2"
 
    local start_num="$1"
    local end_num="${2:-$start_num}"  # If the second argument is not provided, it defaults to the value of the first argument
 
    for (( i=start_num; i<=end_num; i++ )); do
        local CONTAINER_NAME="container-$i"
        if docker ps -a --format '{{.Names}}' | grep -q "^$CONTAINER_NAME\$"; then
            echo "Starting container $CONTAINER_NAME..."
            docker start "$CONTAINER_NAME"
            echo "Container $CONTAINER_NAME started."
        else
            echo "Error: Container $CONTAINER_NAME does not exist."
            exit 1
        fi
    done
}
 
# Stop specified or a range of containers
function stop_container() {
    local start_num="$1"
    local end_num="${2:-$start_num}"  # If the second argument is not provided, it defaults to the value of the first argument
 
    for (( i=start_num; i<=end_num; i++ )); do
        local CONTAINER_NAME="container-$i"
        if docker ps -a --format '{{.Names}}' | grep -q "^$CONTAINER_NAME\$"; then
            echo "Stopping container $CONTAINER_NAME..."
            docker stop "$CONTAINER_NAME"
            echo "Container $CONTAINER_NAME stopped."
        else
            echo "Warning: Container $CONTAINER_NAME does not exist."
        fi
    done
}
 
# Enter the shell of a specified container or range of containers
function exec_container() {
    local start_num="$1"
    local end_num="${2:-$start_num}"  # If the second argument is not provided, it defaults to the value of the first argument
 
    for (( i=start_num; i<=end_num; i++ )); do
        local CONTAINER_NAME="container-$i"
        
        if docker ps -a --format '{{.Names}}' | grep -q "^$CONTAINER_NAME\$"; then
            echo "Executing script in container $CONTAINER_NAME..."
            # Enter the container and run the script
            docker exec -d "$CONTAINER_NAME" bash -c "cd $LOG_ROUTE && $SCRIPT_ROUTE"
            echo "Script executed in container $CONTAINER_NAME."
            # Wait for a short time to ensure the process starts
            sleep 2
        else
            echo "Error: Container $CONTAINER_NAME does not exist or is not running."
            exit 1
        fi
    done
}
 
# Remove a specified container
function remove_container() {
    local container_num="$1"
    local CONTAINER_NAME="container-$container_num"
    
    if docker ps -a --format '{{.Names}}' | grep -q "^$CONTAINER_NAME\$"; then
        echo "Removing container $CONTAINER_NAME..."
        docker rm -f "$CONTAINER_NAME"
        echo "Container $CONTAINER_NAME removed."
    else
        echo "Error: Container $CONTAINER_NAME does not exist."
        exit 1
    fi
}
 
# Function to display information about a specified container
function info_container() {
    local container_num="$1"
    
    if ! [[ "$container_num" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
        echo "Error: The number must be an integer between 1 and 1000."
        return 1
    fi
    
    local CONTAINER_NAME="container-$container_num"
    
    # Check if the container exists
    if docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null | grep -q 'true'; then
        echo "Information for container $CONTAINER_NAME:"
        docker inspect "$CONTAINER_NAME"
    else
        echo "Error: Container $CONTAINER_NAME does not exist or is not running."
    fi
}
 
# Check if the script is running in a specified container or range of containers
function check_script_running() {
    local start_num="$1"
    local end_num="${2:-$start_num}"  # If the second argument is not provided, it defaults to the value of the first argument
 
    for (( i=start_num; i<=end_num; i++ )); do
        local CONTAINER_NAME="container-$i"
        
        # Check if the container exists and is running
        if docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null | grep -q 'true'; then
            echo "Container $CONTAINER_NAME is running."
            
            # Check if MediumBoxBase is running using pgrep
            if docker exec -it "$CONTAINER_NAME" pgrep -f 'MediumBoxBase' > /dev/null; then
                echo "Script is running in container $CONTAINER_NAME."
            else
                echo "Error: Script is not running in container $CONTAINER_NAME."
            fi
        else
            echo "Error: Container $CONTAINER_NAME does not exist or is not running."
        fi
        
        # Add a newline for separation
        echo
    done
    
    # Ensure the terminal ends with a newline
    echo
}
 
# Function to enter a specified container
function entry_container() {
    local container_num="$1"
    
    if ! [[ "$container_num" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
        echo "Error: The number must be an integer between 1 and 1000."
        return 1
    fi
    
    local CONTAINER_NAME="container-$container_num"
    
    # Check if the container exists and is running
    if docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null | grep -q 'true'; then
        echo "Entering container $CONTAINER_NAME..."
        docker exec -it "$CONTAINER_NAME" bash
    else
        echo "Error: Container $CONTAINER_NAME does not exist or is not running."
    fi
}
 
case "$1" in
    help)
            help_container
            ;;
    create)
        if [ "$#" -ne 2 ]; then
            echo "Error: You should provide a parameter after 'create'."
            exit 1
        fi
        
        if ! [[ "$2" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
            echo "Error: The number must be an integer between 1 and 1000."
            exit 1
        fi
        
        create_container "$2"
        ;;
    start)
        # Check the number of parameters to determine whether to start a single container or a container range
        if [ "$#" -lt 2 ]; then
            echo "Error: You should provide at least one number after 'start'."
            exit 1
        elif [ "$#" -eq 2 ]; then
            # If there are only two parameters, try starting a container
            start_container "$2"
        elif [ "$#" -eq 3 ]; then
            # If you have three parameters, try starting a series of containers
            if ! [[ "$2" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]] || ! [[ "$3" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
                echo "Error: Both numbers must be integers between 1 and 1000."
                exit 1
            fi
            if [ "$2" -gt "$3" ]; then
                echo "Error: The first number must be less than or equal to the second."
                exit 1
            fi
            start_container "$2" "$3"
        else
            echo "Error: Too many arguments for 'start'."
            exit 1
        fi
        ;;
    stop)
        if [ "$#" -lt 2 ]; then
            echo "Error: You should provide at least one number after 'stop'."
            exit 1
        fi
        
        if ! [[ "$2" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
            echo "Error: The number(s) must be integers between 1 and 1000."
            exit 1
        fi
        
        if [ "$#" -eq 2 ]; then
            stop_container "$2"
        elif [ "$#" -eq 3 ]; then
            if ! [[ "$3" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
                echo "Error: Both numbers must be integers between 1 and 1000."
                exit 1
            fi
            if [ "$2" -gt "$3" ]; then
                echo "Error: The second number must be greater than or equal to the first."
                exit 1
            fi
            stop_container "$2" "$3"
        else
            echo "Error: Too many arguments for 'stop'."
            exit 1
        fi
        ;;
    exec)
        if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then
            echo "Error: You should provide one or two numbers after 'exec'."
            exit 1
        fi
        
        if ! [[ "$2" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
            echo "Error: The number(s) must be integers between 1 and 1000."
            exit 1
        fi
        
        if [ "$#" -eq 2 ]; then
            exec_container "$2"
        elif [ "$#" -eq 3 ]; then
            if ! [[ "$3" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
                echo "Error: Both numbers must be integers between 1 and 1000."
                exit 1
            fi
            if [ "$2" -gt "$3" ]; then
                echo "Error: The first number must be less than or equal to the second."
                exit 1
            fi
            exec_container "$2" "$3"
        fi
        ;;
    check)
        if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then
            echo "Error: You should provide one or two numbers after 'check'."
            exit 1
        fi
        
        if ! [[ "$2" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
            echo "Error: The number(s) must be integers between 1 and 1000."
            exit 1
        fi
        
        if [ "$#" -eq 2 ]; then
            check_script_running "$2"
        elif [ "$#" -eq 3 ]; then
            if ! [[ "$3" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
                echo "Error: Both numbers must be integers between 1 and 1000."
                exit 1
            fi
            if [ "$2" -gt "$3" ]; then
                echo "Error: The first number must be less than or equal to the second."
                exit 1
            fi
            check_script_running "$2" "$3"
        fi
        # Reset the terminal to ensure normal behavior
        stty sane
        ;;
    entry)
        if [ "$#" -ne 2 ]; then
            echo "Error: You should provide exactly one number after 'entry'."
            exit 1
        fi
        
        if ! [[ "$2" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
            echo "Error: The number must be an integer between 1 and 1000."
            exit 1
        fi
        
        entry_container "$2"
        ;;
    remove)
        if [ "$#" -ne 2 ]; then
            echo "Error: You should provide exactly one number after 'remove'."
            exit 1
        fi
        
        if ! [[ "$2" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
            echo "Error: The number must be an integer between 1 and 1000."
            exit 1
        fi
        
        remove_container "$2"
        ;;
    info)
        if [ "$#" -ne 2 ]; then
            echo "Error: You should provide exactly one number after 'info'."
            exit 1
        fi
        
        if ! [[ "$2" =~ ^[1-9][0-9]{0,2}|[1-9][0-9]{3}$ ]]; then
            echo "Error: The number must be an integer between 1 and 1000."
            exit 1
        fi
        
        info_container "$2"
        ;;
    logs|status)
        echo "Function '$1' has not been updated to handle numbered containers."
        exit 1
        ;;
    *)
        echo "Invalid command. Use './docker_operations.sh help' to get instructions."
        exit 1
        ;;
esac
 
exit 0

./mnt/container_run_medium.sh

复制代码
#!/bin/bash
 
# 清理旧的日志文件
rm -f *.log
rm -f nohup.out
rm -f cssd.dat
 
# 启动 pwbox_simu 和 MediumBoxBase
nohup /mnt/simutools/pwbox_simu /mnt/simutools/pw_box.conf > /dev/null 2>&1 &
nohup /mnt/mediumSimu/MediumBoxBase /mnt/mediumSimu/hynn_flash_config_simu.conf > /dev/null 2>&1 &
相关推荐
凯子坚持 c3 小时前
CANN 性能剖析实战:从原始事件到交互式火焰图
windows·microsoft
开开心心就好4 小时前
发票合并打印工具,多页布局设置实时预览
linux·运维·服务器·windows·pdf·harmonyos·1024程序员节
獨枭4 小时前
PyCharm 跑通 SAM 全流程实战
windows
仙剑魔尊重楼5 小时前
音乐制作电子软件FL Studio2025.2.4.5242中文版新功能介绍
windows·音频·录屏·音乐·fl studio
PHP小志5 小时前
Windows 服务器怎么修改密码和用户名?账户被系统锁定如何解锁
windows
专注VB编程开发20年7 小时前
vb.net datatable新增数据时改用数组缓存
java·linux·windows
仙剑魔尊重楼7 小时前
专业音乐制作软件fl Studio 2025.2.4.5242中文版新功能
windows·音乐·fl studio
rjc_lihui8 小时前
Windows 运程共享linux系统的方法
windows
失忆爆表症8 小时前
01_项目搭建指南:从零开始的 Windows 开发环境配置
windows·postgresql·fastapi·milvus
阿昭L9 小时前
C++异常处理机制反汇编(三):32位下的异常结构分析
c++·windows·逆向工程