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

一 需求说明

  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

正常进程

在这里插入图片描述


@漏刻有时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础学习之数据切片

数据切片介绍: 切片的基本语法是data[start:stop:step],其中: start 是切片开始的索引(包括该索引处的元素)。 stop 是切片结束的索引(不包括该索引处的元素)。 step 是切片的步长&#xff0…

【S32K3 入门系列】- ADC 模块简介(上)

一、 前言 对于 S32K3 系列的初学者来说,S32K3 系列的参考手册阅读难度是让人望而却步的,本系列将对 S32K3 系列的外设进行逐一介绍,对参考手册一些要点进行解析。本文旨在介绍 S32K3 系列的 ADC 模块, ADC(Analog to…

Stable Diffusion 模型分享:ChilloutMix(真实、亚洲面孔)chilloutmix_NiPrunedFp32Fix

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 相信近来吸引大家想一试 Stable Diffusion 图像生…

嵌入式面试-回答I2C

说明: 此文章是在阅读了一些列面试相关资料之后对于一些常见问题的整理,主要针对的是嵌入式软件面试中涉及到的问答,努力精准的抓住重点进行描述。若有不足非常欢迎指出,感谢!在总结过程中有些答案没标记参考来源&…

轻薄手机,没有一款新机能超越小米11青春版,小米和苹果也没有

打算换手机,但是不喜欢半斤机,于是找了几款轻薄手机,却发现如今的轻薄手机都太重了,还不如3年前的小米11青春版,可见小米11青春版是一款相当能打的手机。 小米11青春版搭载骁龙778芯片,重量只有159克&#…

《游戏系统设计十二》灵活且简单的条件检查系统

目录 1、序言 2、需求 3、实现 3.1 思路 3.2 代码实现 4、总结 1、序言 每个游戏都有一些检查性的任务,在做一些判断的时候,判断等级是不是满足需求。 比如如下场景:在进入副本的时候需要检查玩家等级是否满足,满足之后才…

YOLOv5 / YOLOv7 / YOLOv8 / YOLOv9 / RTDETR -gui界面-交互式图形化界面

往期热门博客项目回顾:点击前往 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上…

js-pytorch:开启前端+AI新世界

嗨, 大家好, 我是 徐小夕。最近在 github 上发现一款非常有意思的框架—— js-pytorch。它可以让前端轻松使用 javascript 来运行深度学习框架。作为一名资深前端技术玩家, 今天就和大家分享一下这款框架。 往期精彩 Nocode/Doc,可…

JWT和Redis比较选型

一、Session 二、JWT 三、比较 基于JWT(JSON Web Token)和Session身份验证之间的争论是现代 Web 开发中的一个要点。 JWT 身份验证:无状态。服务器生成一个令牌,客户端存储该令牌并随每个请求一起提供,服务端仅需按照…

LeetCode in Python 200. Number of islands (岛屿数量)

岛屿数量既可以用深度优先搜索也可以用广度优先搜索解决,本文给出两种方法的代码实现。 示例: 图1 岛屿数量输入输出示意图 方法一:广度优先搜索(bfs) 代码: class Solution:def numIslands(self, grid):if not grid:return 0…

IO综述·

阻塞模式 读写数据会发生阻塞现象。当用户线程发起IO请求之后,内核会查看数据检查就绪。如果没有就绪就会等待数据就绪。而用户线程会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户…

KMP算法(Python)

进阶的做法就是KMP算法,当然暴力也能ac。 KMP主要用一个nex列表,nex[i]存储(模式串needle中)从第0个到i个字符串s中的一个相等前后缀的最大长度。比如说对于aabaa来说,最大长度应该是(前缀aa)和…

Linux下SPI设备驱动实验:验证读写SPI设备中数据的函数功能

一. 简介 前面文章实现了 SPI设备驱动框架,并在此基础上添加了字符设备驱动框架,实现了读 / 写SPI设备中数据的函数,文章如下: Linux下SPI设备驱动实验:向SPI驱动框架中加入字符设备驱动框架代码-CSDN博客 Linux下…

算法打卡day51|单调栈篇02| Leetcode 503.下一个更大元素II、42. 接雨水

算法题 Leetcode 503.下一个更大元素II 题目链接:503.下一个更大元素II 大佬视频讲解:503.下一个更大元素II视频讲解 个人思路 这道题和之前496.下一个更大元素 I 差不多,只是这道题需要循环数组,那就在遍历的过程中模拟走两遍nums就行&a…

本地主机搭建服务器后如何让外网访问?快解析内网端口映射

本地主机搭建应用、部署服务器后,在局域网内是可以直接通过计算机内网IP网络地址进行连接访问的,但在外网电脑和设备如何访问呢?由于内网环境下,无法提供公网IP使用,外网访问内网就需要一个内外网转换的介质。这里介绍…

在PostgreSQL中如何创建和使用自定义函数,包括内置语言(如PL/pgSQL)和外部语言(如Python、C等)?

文章目录 一、使用内置语言 PL/pgSQL 创建自定义函数示例代码使用方法 二、使用外部语言 Python 创建自定义函数安装 PL/Python 扩展示例代码使用方法 三、使用外部语言 C 创建自定义函数编写 C 代码编译为共享库在 PostgreSQL 中注册函数注意事项 总结 PostgreSQL 是一个强大的…

CSS基础:table的4个标签的样式详解(6000字长文!附案例)

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端工具”,可获取 Web 开发工具合…

记一次中间件宕机以后持续请求导致应用OOM的排查思路(server.max-http-header-size属性配置不当的严重后果)

一、背景 最近有一次在系统并发比较高的时候,数据库突然发生了故障,导致大量请求失败,在数据库宕机不久,通过应用日志可以看到系统发生了OOM。 二、排查 初次看到这个现象的时候,我还是有点懵逼的,数据库…

项目二:学会使用python爬虫请求库(小白入门级)

上一章已经了解python爬虫的基本知识,这一次让我们一起来学会如何使用python请求库爬取目标网站的信息。当然这次爬虫之旅相信我能给你带来不一样的体验。 目录 一、安装requests 库 简介 安装 步骤 1.requests的基本使用3步骤 2.查看所使用编码 3.设置编码…

Redis中BitMap在钉钉机器人中的应用

性能分析 数据库中有1000w用户,每个用户签到一次,对应两个字段 连续签到多少次 、签到时间。 签到时间字段占用10个字节,连续签到多少天 占用5个字节(假设一个用户能活100年,每天都签到,一个用户最多签到3…