PHP定时任务框架taskPHP3.0学习记录4宝塔面板bash定时任务(轮询指定json文件字段后确定是否执行、环境部署、执行日志、文件权限)

发布于:2024-04-20 ⋅ 阅读:(19) ⋅ 点赞:(0)

一 需求说明

  1. 宝塔面板中,读取指定 /www/wwwroot/lockdata/cron/webapp.json文件;
  2. 配置定时任务脚本task.sh;
  3. 当读取webapp.json中,如果cron_task=1,则执行任务php start.php start命令行;
  4. 完成命令后,执行cron_task=0和"cron_time=当前执行时间;
  5. 记录日志;
  6. 宝塔设置定时任务;
  7. webapp.json,由web后台系统生成;task.sh轮询读取后,需恢复www和root用户权限的切换;

二 环境部署

1.指定文件webapp.json

  • 文件内容
{
  "cron_task": 0,
  "cron_time": "2024-04-19 10:50:01"
}

  • 文件用户权限 www 755
    在这里插入图片描述

2.安装jq和检验

要安装jq并检验是否已安装,根据所使用的Linux发行版使用相应的包管理器。安装方法如下:

对于CentOS/RHEL系统:

首先,需要启用EPEL(Extra Packages for Enterprise Linux)仓库,然后使用yum安装jq

sudo yum install epel-release
sudo yum install jq

同样,安装完成后,可以通过运行jq --version来检验是否安装成功。

检验是否安装过

如果确定是否已经安装了jq,可以直接在终端中输入jq --version。如果系统返回了jq的版本信息,那就说明已经安装过了。如果系统提示找不到jq命令,那就说明还没有安装,或者jq没有安装在系统的PATH环境变量所包含的目录中。在这种情况下,需要按照上述步骤进行安装。

三 执行脚本task.sh

#!/bin/bash  
  
# 定义工作目录和JSON配置文件路径  
#!/bin/bash  
  
# 获取脚本所在的绝对路径  
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"  
  
# 定义工作目录为脚本所在的目录  
WORKDIR="$SCRIPT_DIR"  
  
# JSON配置文件的路径为工作目录下的一个子目录或文件  
JSON_CONFIG="$WORKDIR/webapp.json"

# 获取当前时间并格式化为"YYYY-MM-DD HH:MM:SS"  
CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")  

# 日志属性设置
LOG_DIR="$(pwd)/logs"  # 日志文件存放的目录  
TODAY=$(date +"%Y-%m-%d")  # 获取当前日期  
LOG_FILE="${LOG_DIR}/${TODAY}_cron.log"  # 定义日志文件名,包含日期  

# 确保日志目录存在  
mkdir -p "$LOG_DIR"  

# 检查JSON配置文件是否存在  
if [ ! -f "$JSON_CONFIG" ]; then  
    echo "Msg:$JSON_CONFIG JSON configuration file missing."  
    echo "[$CURRENT_TIME]Msg:taskPHP JSON configuration file missing." >> "$LOG_FILE"  
    exit 1  
fi  
  
# 读取JSON配置文件中的cron_task值  
cron_task=$(jq -r '.cron_task' "$JSON_CONFIG")  
  
# 检查是否应该执行cron任务  
if [ "$cron_task" -eq 1 ]; then  
    echo "Msg:taskPHP scheduled in progress."  #taskPHP定时任务CRON执行中
    echo "[$CURRENT_TIME]Msg:taskPHP scheduled in progress." >> "$LOG_FILE"  
      
    # 切换到工作目录  
    cd "$WORKDIR" || exit 1  
    
    # 获取JSON配置文件的原始权限和所有者  
    ORIGINAL_OWNER=$(stat -c %U "$JSON_CONFIG")  
    ORIGINAL_GROUP=$(stat -c %G "$JSON_CONFIG")  
    ORIGINAL_PERMISSIONS=$(stat -c %a "$JSON_CONFIG")  
    
   
   # 更新JSON文件  
   jq --argjson cron_task 0 --arg cron_time "$CURRENT_TIME" '.cron_task=$cron_task | .cron_time=$cron_time' "$JSON_CONFIG" > "$JSON_CONFIG.tmp" && {  
    # 如果jq命令成功,则移动临时文件到原始位置并设置原始权限  
    mv "$JSON_CONFIG.tmp" "$JSON_CONFIG" &&  
    chown "$ORIGINAL_OWNER:$ORIGINAL_GROUP" "$JSON_CONFIG" &&  
    chmod "$ORIGINAL_PERMISSIONS" "$JSON_CONFIG"  
    echo "[$CURRENT_TIME]Msg:taskPHP has been reset to 0 and original rights have been maintained." >> "$LOG_FILE"  
    } 
   
   # 检查上一步是否成功,并据此向日志文件中添加相应的信息  
   if [ $? -eq 0 ]; then  
      echo "[$CURRENT_TIME]Msg:taskPHP has completed execution." >> "$LOG_FILE"  #完成更新
   else  
      echo "[$CURRENT_TIME]Msg:taskPHP incomplete execution." >> "$LOG_FILE"  #未完成更新
   fi 
  
  # 输出更新后的JSON内容(可选,用于验证)  
  # cat "$JSON_CONFIG" 
    
      
    # 执行PHP脚本  
    php start.php start  
      
    # 如果需要等待一段时间再执行exit,可以添加sleep命令  
    # sleep 600  # 等待10分钟  
      
else  
    echo "Msg:taskPHP has no task execution status."  #taskPHP无执行任务状态
    echo "[$CURRENT_TIME]Msg:taskPHP has no task execution status." >> "$LOG_FILE"  
fi

四 定时执行

执行脚本

/www/wwwroot/lockdata/cron/task.sh

在这里插入图片描述
即完成定时任务的设置

五 执行日志

执行进程1

在这里插入图片描述

执行进程2

在这里插入图片描述

进程错误:Address already in use

[10:40:18][taskPHP]:socket_bind err:Address already in use

  • 解决方案:使用命令行结束任务,然后再执行启动任务即可
    # 结束任务
    php start.php close all

正常进程

在这里插入图片描述


@漏刻有时