根据jar进程和多IP批量移动目录shell脚本

一 需求

多个目录

  • /data/test1

  • /data/test2

批量执行多个IP地址

java运行进程名称和目录名称一致

  • /data/test1/test1.jar

  • jps查看为:test1.jar

二 依赖文件

IP地址文件

cat servers.txt
192.168.1.1
192.168.1.2

三 脚本一 手动指定ip地址和目录

目录文件

cat java.txt
/data/test1
/data/test2

cat test.sh
#!/bin/bash

# 服务器列表文件
SERVER_LIST="servers.ip"

# java.txt 文件路径
JAVA_TXT_PATH="java.txt"

# 目标目录
TARGET_DIR="/opt/soft/"

# 读取 java.txt 文件中的内容,并为每行(每个路径)执行 mv 命令
while IFS= read -r line; do
    cat "$SERVER_LIST" | xargs -I {} -P 5 ssh -p 52222 -l admin {} "sudo mv $line $TARGET_DIR"
done < "$JAVA_TXT_PATH"

四 脚本二 手动指定ip地址和根据java运行进程保留目录

cat test2.sh
#!/bin/bash

# 服务器列表文件
SERVER_LIST="servers.txt"

# java.txt 文件路径
JAVA_TXT_PATH="java"

# 目标目录
TARGET_DIR="/opt/soft/"

# 读取 java.txt 文件中的内容,并为每行(每个路径)执行操作
while IFS= read -r dir; do
    # 获取目录的基本名称(不含路径)
    dir_base_name=$(basename "$dir")

    # 读取服务器列表,并为每个服务器执行操作
    while IFS= read -r server; do
        # 使用 SSH 连接到服务器并执行 jps 命令,检查 Java 进程
        jps_output=$(ssh -p 52222 -l admin "$server" 'jps -l')

        # 检查输出中是否包含当前目录的基本名称,忽略.jar扩展名
        for process in $(echo "$jps_output" | grep '\.jar$' | awk -F ' ' '{print $2}'); do
            if [[ "$process" == "$dir_base_name" ]]; then
                echo "保留 $server 上的 $dir 目录,因为存在同名 Java 进程。"
                break # 找到匹配的进程,跳出循环
            fi
        done

        # 如果上面的循环没有找到匹配的进程,则移动目录
        if [ "${process}" != "$dir_base_name" ]; then
            echo "移动 $server 上的 $dir 目录到 $TARGET_DIR。"
            ssh -p 52222 -l admin "$server" "mv $dir $TARGET_DIR"
        fi
    done < "$SERVER_LIST"
done < "$JAVA_TXT_PATH"