项目启动停止脚本
Salted Fish 2025/9/24 语法
#!/bin/bash
# 通用项目启动管理脚本
# 使用: ./run.sh {start|stop|restart|status|log}
############################ 配置区域 ############################
# 项目信息
APP_NAME="CSA-PROCESSOR" # 进程名(用于识别)
APP_DISPLAY="CSA处理器" # 显示名称
APP_HOME="/home/csa/app/csa-processor" # 项目目录
APP_JAR="libs/csa-processor.jar" # 主JAR文件
# Java参数
JVM_OPTS="-server -Xms18g -Xmx18g -XX:MetaspaceSize=256m"
GC_OPTS="-XX:+UseG1GC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:logs/gc.log"
OTHER_OPTS="-Ddruid.mysql.usePingMethod=false -Dloader.path=libs"
# 文件路径
LOG_DIR="logs"
PID_FILE="logs/app.pid" # PID文件
MAIN_LOG="logs/sys-debug.log" # 主日志文件
############################ 脚本逻辑 ############################
# 组合参数
RUN_OPTS="$JVM_OPTS $GC_OPTS $OTHER_OPTS"
get_pid() {
# 从PID文件获取
if [ -f "$APP_HOME/$PID_FILE" ]; then
local pid=$(cat "$APP_HOME/$PID_FILE" 2>/dev/null)
if [ -n "$pid" ] && ps -p $pid >/dev/null 2>&1; then
echo $pid
return
fi
fi
# 从进程名获取
ps -ef | grep java | grep -v grep | grep "$APP_NAME" | awk '{print $2}'
}
status() {
pid=$(get_pid)
if [ -n "$pid" ]; then
echo "[运行中] $APP_DISPLAY (PID: $pid)"
else
echo "[未运行] $APP_DISPLAY"
fi
}
start() {
echo "启动 $APP_DISPLAY ..."
pid=$(get_pid)
if [ -n "$pid" ]; then
echo "错误: 应用已在运行 (PID: $pid)"
return 1
fi
if [ ! -d "$APP_HOME" ]; then
echo "错误: 项目目录不存在: $APP_HOME"
return 1
fi
if [ ! -f "$APP_HOME/$APP_JAR" ]; then
echo "错误: JAR文件不存在: $APP_HOME/$APP_JAR"
return 1
fi
cd "$APP_HOME" || return 1
mkdir -p "$LOG_DIR"
# 清空旧日志(可选,如不需要可注释掉)
# > "$MAIN_LOG"
nohup java $RUN_OPTS -Dname=$APP_NAME -jar $APP_JAR >/dev/null 2>&1 &
echo "启动中,等待3秒..."
sleep 3
pid=$(get_pid)
if [ -n "$pid" ]; then
echo "$pid" > "$PID_FILE"
echo "启动成功! PID: $pid"
# 启动后自动显示日志
if [ -f "$MAIN_LOG" ]; then
echo ""
echo "=== 开始显示启动日志 (Ctrl+C 退出日志查看) ==="
tail -f "$MAIN_LOG"
else
echo "提示: 日志文件尚未生成,可使用 './run.sh log' 查看日志"
fi
else
echo "启动失败!"
# 启动失败也显示日志(如果有)
if [ -f "$MAIN_LOG" ]; then
echo ""
echo "=== 查看错误日志 ==="
tail -50 "$MAIN_LOG"
fi
fi
}
stop() {
echo "停止 $APP_DISPLAY ..."
pid=$(get_pid)
if [ -z "$pid" ]; then
echo "应用未运行"
return 0
fi
kill $pid 2>/dev/null
# 等待正常停止
for i in {1..15}; do
if ! ps -p $pid >/dev/null 2>&1; then
break
fi
sleep 1
echo -n "."
done
echo ""
# 强制停止
if ps -p $pid >/dev/null 2>&1; then
echo "强制停止..."
kill -9 $pid
sleep 2
fi
if ps -p $pid >/dev/null 2>&1; then
echo "停止失败! PID: $pid"
return 1
else
> "$APP_HOME/$PID_FILE"
echo "停止成功!"
fi
}
restart() {
echo "重启 $APP_DISPLAY ..."
if stop; then
sleep 2
start
else
echo "停止失败,无法重启"
return 1
fi
}
log() {
if [ -f "$APP_HOME/$MAIN_LOG" ]; then
echo "跟踪日志文件: $MAIN_LOG (Ctrl+C 退出)"
tail -f "$APP_HOME/$MAIN_LOG"
else
echo "日志文件不存在: $APP_HOME/$MAIN_LOG"
fi
}
# 显示最近日志(不跟踪)
show_log() {
if [ -f "$APP_HOME/$MAIN_LOG" ]; then
echo "最近日志内容:"
tail -100 "$APP_HOME/$MAIN_LOG"
else
echo "日志文件不存在: $APP_HOME/$MAIN_LOG"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
log)
log
;;
show-log)
show_log
;;
*)
echo "使用: $0 {start|stop|restart|status|log|show-log}"
echo ""
echo "命令说明:"
echo " start - 启动应用并自动显示启动日志"
echo " stop - 停止应用"
echo " restart - 重启应用并显示启动日志"
echo " status - 查看应用状态"
echo " log - 实时跟踪应用日志"
echo " show-log - 显示最近日志内容"
echo ""
echo "当前配置:"
echo " 应用: $APP_DISPLAY"
echo " 目录: $APP_HOME"
echo " JAR文件: $APP_JAR"
echo " 日志文件: $MAIN_LOG"
;;
esac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208