编辑linux启动脚本
执行 vi run_blog 按i 进入编辑,复制以下代码,并根据当前环境修改三个参数。以下是详细完整脚本代码:
#!/bin/bash
# 配置部分
JAR_PATH="/path/to/your/app.jar" # 替换为你的 JAR 文件的实际路径
LOG_FILE="/var/log/app.log" # 日志文件路径
JAVA_OPTS="-Xms512m -Xmx1024m" # Java 启动参数,可根据需要调整
# 获取应用的 PID
get_pid() {
# 使用 pgrep 查找运行指定 JAR 的 Java 进程
pgrep -f "java .* -jar $JAR_PATH"
}
# 启动函数
start() {
PID=$(get_pid)
if [ -n "$PID" ]; then
echo "应用已在运行,PID=$PID"
exit 1
fi
echo "启动应用..."
nohup java $JAVA_OPTS -jar "$JAR_PATH" > "$LOG_FILE" 2>&1 &
sleep 1 # 确保进程有时间启动
PID=$(get_pid)
if [ -n "$PID" ]; then
echo "应用已启动,PID=$PID"
else
echo "启动失败,请检查日志文件:$LOG_FILE"
exit 1
fi
}
# 停止函数
stop() {
PID=$(get_pid)
if [ -z "$PID" ]; then
echo "应用未运行"
exit 1
fi
echo "停止应用,PID=$PID"
kill $PID
# 等待进程结束
for i in {1..10}; do
if ! ps -p $PID > /dev/null 2>&1; then
break
fi
sleep 1
done
if ps -p $PID > /dev/null 2>&1; then
echo "进程未正常停止,强制杀死进程"
kill -9 $PID
fi
echo "应用已停止"
}
# 重启函数
restart() {
stop
start
}
# 状态检查函数
status() {
PID=$(get_pid)
if [ -n "$PID" ]; then
echo "应用正在运行,PID=$PID"
exit 0
else
echo "应用未运行"
exit 1
fi
}
# 主逻辑,根据传入的参数执行相应的函数
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo "用法: $0 {start|stop|restart|status}"
exit 1
;;
esac
使用说明
-
配置脚本
- 修改
JAR_PATH
:将/path/to/your/app.jar
替换为你的 JAR 文件的实际路径,例如/home/user/myapp/app.jar
。 - 修改
LOG_FILE
:设置日志文件的路径,例如/var/log/app.log
。 - 调整
JAVA_OPTS
:根据需要调整 Java 启动参数,例如内存设置等。
- 修改
-
赋予执行权限
chmod +x app_control.sh
使用脚本
-
启动应用
./run_blog.sh start
-
停止应用
./run_blog.sh stop
-
重启应用
./run_blog.sh restart
-
检查应用状态
./run_blog.sh status
详细说明
-
获取 PID
脚本通过
pgrep -f "java .* -jar $JAR_PATH"
来查找运行指定 JAR 文件的 Java 进程。这种方法避免了使用 PID 文件,确保脚本能够准确定位到对应的进程。 -
启动应用
使用
nohup
和&
将应用在后台运行,并将输出重定向到指定的日志文件。启动后,脚本会等待一秒钟以确保进程已启动,并再次检查 PID。 -
停止应用
脚本首先查找应用的 PID,然后发送
SIGTERM
信号请求进程优雅退出。如果进程在 10 秒内未停止,脚本将发送SIGKILL
信号强制终止进程。 -
状态检查
通过检查 PID 是否存在,判断应用是否正在运行,并输出相应的信息。
执行脚本如下图:
自动启动(可选)
如果希望应用在系统启动时自动运行,可以将脚本添加到 systemd
服务中。以下是创建 systemd
服务单元文件的步骤:
-
创建服务单元文件
创建一个
app.service
文件在/etc/systemd/system/
目录下:[Unit] Description=My Java Application After=network.target [Service] User=your_username ExecStart=/path/to/app_control.sh start ExecStop=/path/to/app_control.sh stop Restart=always [Install] WantedBy=multi-user.target
注意:
- 将
your_username
替换为运行应用的实际用户名。 - 将
/path/to/app_control.sh
替换为脚本的实际路径。
启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable app.service
sudo systemctl start app.service
-
管理服务
使用
systemctl
命令来管理应用:-
查看状态
sudo systemctl status app.service
-
停止服务
sudo systemctl stop app.service
-
重启服务
sudo systemctl restart app.service
-
日志查看
应用的输出被重定向到指定的日志文件。你可以使用以下命令实时查看日志:
tail -f /var/log/app.log
注意事项
- 权限问题:确保脚本和日志文件的路径对运行脚本的用户具有适当的读写权限。如果选择将日志文件存放在
/var/log
,可能需要使用sudo
或调整权限。 - 唯一性:如果服务器上有多个相同 JAR 文件运行,
pgrep
可能会匹配多个进程。确保JAR_PATH
唯一,或者根据需要调整pgrep
的匹配模式。 - 安全性:确保脚本的执行权限和文件权限设置合理,避免未经授权的用户修改或执行脚本。