项目启动脚本
#!/bin/sh
AppName=job.jar #替换为自己项目jar包
# JVM参数
JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms512m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
APP_HOME=`pwd`
#LOG_PATH=$APP_HOME/logs/$AppName.log
#DLOADER_PATH="-Dloader.path="$APP_HOME/lib
if [ "$1" = "" ];
then
echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
exit 1
fi
if [ "$AppName" = "" ];
then
echo -e "\033[0;31m 未输入应用名 \033[0m"
exit 1
fi
function start()
{
PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
if [ x"$PID" != x"" ];
then echo "$AppName is running..."
else
nohup java $JVM_OPTS -jar $AppName > /dev/null 2>&1 & echo "Start $AppName success..."
fi
}
function stop() {
echo "Stop $AppName"
PID=""
query(){
PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
} query if [ x"$PID" != x"" ];
then kill -TERM $PID echo "$AppName (pid:$PID) exiting..."
while [ x"$PID" != x"" ] do sleep 1
query done echo "$AppName exited."
else echo "$AppName already stopped."
fi
}
function restart() {
stop
sleep 2
start
}
function status() {
PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l`
if [ $PID != 0 ];then
echo "$AppName is running..."
else
echo "$AppName is not running..."
fi
}
case $1 in start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
esac
将脚本保存为 job.sh,并赋予可执行权限:chmod +x job.sh
健康检测脚本(多项目)
``
#!/bin/bash
# 定义变量
APP_HOME="/opt/data/job" # 应用程序目录
LOG_DIR="/opt/data/job/logs" # 日志目录
JAR_FILES=("job" "mall-system") # 要监控的 JAR 文件列表
# 获取当前时间戳
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$TIMESTAMP] 开始健康检查。" >> $LOG_DIR/healthcheck.log
# 检查并启动 JAR 文件
function check_and_start() {
local jar_name=$1
local script_name="$jar_name.sh" # 获取对应的启动脚本名称
local pid=$(pgrep -f $jar_name)
if [ -z "$pid" ]; then
# 如果未找到进程,则调用启动脚本启动应用
echo "[$TIMESTAMP] $jar_name 未找到进程,调用启动脚本启动应用 $script_name..." >> $LOG_DIR/healthcheck.log
bash $APP_HOME/$script_name start
echo "[$TIMESTAMP] $jar_name restarted using $script_name." >> $LOG_DIR/healthcheck.log
else
# 如果应用正在运行,则记录状态
echo "[$TIMESTAMP] $jar_name 正在运行 (PID: $pid)." >> $LOG_DIR/healthcheck.log
fi
}
# 主逻辑:遍历所有 JAR 文件并检查
for jar in "${JAR_FILES[@]}"; do
check_and_start $jar
done
# 输出完成信息
echo "[$TIMESTAMP] 健康检查完成。" >> $LOG_DIR/healthcheck.log
测试脚本
- 将脚本保存为 healthcheck.sh,并赋予可执行权限:
chmod +x healthcheck.sh - 手动运行脚本测试
./healthcheck.sh - 检查日志文件,确认脚本是否正常工作
tail -f /path/to/your/logs/healthcheck.log
注意事项
1. 权限问题
- 确保脚本有权限访问 APP_HOME 和 LOG_DIR。
- 如果使用 cron 执行脚本,请确保 Cron 环境中有正确的路径和权限。
2. 启动脚本路径
- 确保每个 JAR 文件的启动脚本位于 $APP_HOME 目录下,并且具有可执行权限。
3. 错误处理
- 如果启动脚本执行失败,可以在健康检查脚本中增加重试机制或发送告警通知。
4. 扩展性
- 如果需要监控更多 JAR 文件,只需在 JAR_FILES 数组中添加新的文件名即可。
定时任务
1. 确保 Cron 服务已启用并开机自启
检查 Cron 服务状态
使用以下命令检查 cron 或 crond 服务是否正在运行:
systemctl status cron # Debian/Ubuntu 系统
systemctl status crond # CentOS/RHEL 系统
如果服务未运行,可以启动它:
systemctl start cron # Debian/Ubuntu 系统
systemctl start crond # CentOS/RHEL 系统
设置开机自启
确保 cron 或 crond 服务在系统重启后自动启动:
systemctl enable cron # Debian/Ubuntu 系统
systemctl enable crond # CentOS/RHEL 系统
2. 配置定时任务
编辑用户的 Crontab 文件
使用 crontab -e 命令编辑当前用户的定时任务列表。
crontab -e
添加定时任务
假设你需要每 5 分钟运行一次健康检查脚本 healthcheck.sh,可以添加如下内容:
*/5 * * * * /bin/bash /path/to/your/script/healthcheck.sh >> /path/to/your/logs/cron.log 2>&1
注意事项
- 确保脚本路径是绝对路径。
- 如果脚本依赖某些环境变量,请在 Crontab 中显式设置这些变量。例如:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin JAVA_HOME=/usr/lib/jvm/java-11
- 使用 >> 将输出重定向到日志文件,便于后续排查问题。
3. 防止定时任务因权限问题无法执行
检查文件权限
确保脚本文件具有可执行权限:
chmod +x /path/to/your/script/healthcheck.sh
检查 Crontab 文件权限
Crontab 文件的权限应为只读,避免被其他用户修改:
ls -l /var/spool/cron/crontabs/
如果权限不正确,可以修复:
sudo chmod 600 /var/spool/cron/crontabs/$(whoami)