Java jar包程序 启动停止脚本 shell bash

时间:2025-05-14 10:52:56
#!/bin/bash # 检查是否提供了 app_prefix 参数 if [ -z "$1" ]; then app_prefix="" # 设置默认值 else app_prefix="$1" fi # 运行 ps 命令并通过管道筛选出匹配的进程 # processes=$(ps -ef | grep "$app_prefix.*.jar" | grep -v grep) processes=$(ps -ef | grep "[j]ava.*\b${app_prefix}[^/]*\.jar\b") # 检查是否存在匹配的进程 if [ -z "$processes" ]; then echo "没有找到匹配的进程。" exit 1 fi # 打印选项 options=() while IFS= read -r line; do pid=$(echo "$line" | awk '{print $2}') options+=("$pid") # 假设进程信息中包含了完整的jar路径,使用awk或其它方式提取jar包名 jar_name=$(echo "$line" | grep -oP '(?:.*/)?\K[\w.-]+\.jar(?=\s|$)') # 如果直接获取jar名称有困难,请根据实际情况调整正则表达式或处理逻辑 if [[ -z "$jar_name" ]]; then jar_name="unknown jarName" # 如果没有找到jar包名,则设置为"N/A" fi echo "${#options[@]}. $pid -- $jar_name -- $line" done <<< "$processes" # 循环校验选择 while true; do read -p "请输入序号进行选择: " choice # 检查输入是否为空或非数字 if [[ -z "$choice" || ! "$choice" =~ ^[0-9]+$ ]]; then echo "错误:请输入有效数字。" continue fi # 将输入转换为索引 index=$((choice - 1)) # 检查索引是否在有效范围内 if [[ $index -lt 0 || $index -ge ${#options[@]} ]]; then echo "无效的序号,请输入一个有效的序号。" continue fi selected_pid="${options[index]}" echo "" echo "您选择了进程 PID:$selected_pid" # 发送 SIGTERM(15)信号给选中的进程 kill -15 "$selected_pid" echo "已发送 SIGTERM (15) 给进程 $selected_pid,正在等待其终止..." # 等待并检查进程是否终止 attempts=0 # 尝试 10 次(可自定义) max_attempts=10 # 等待1秒(可自定义) interval=1 while [ $attempts -lt $max_attempts ]; do if kill -0 "$selected_pid" 2>/dev/null; then sleep "$interval" attempts=$((attempts + 1)) else echo "进程 $selected_pid 已成功终止。" break 2 fi done # 若仍未终止,询问是否强制终止 if kill -0 "$selected_pid" 2>/dev/null; then read -p "进程 $selected_pid 未响应 SIGTERM,是否强制终止?(y/n): " confirm case "$confirm" in y|Y|yes|YES) kill -9 "$selected_pid" sleep 1 if kill -0 "$selected_pid" 2>/dev/null; then echo "错误:无法强制终止进程 $selected_pid。请手动处理。" exit 1 else echo "进程 $selected_pid 已被强制终止。" fi ;; n|N|no|NO) echo "您选择不强制终止进程 $selected_pid。" exit 0 ;; *) echo "输入无效,请输入 y 或 n。" continue ;; esac else echo "进程已正常终止。" fi break done exit 0