[每周一更]-(第0期):关于公司业务报告自动化脚本的处理方案

每周一更,这个话题:记录每周分享内容,周五发布

在这里插入图片描述

背景:

公司的业务中有生成PDF报告的逻辑,我们目前是通过PHP将底层复杂的业务用于只生成PDF,针对不同客户的样本信息先改状态到排队状态,即将任务控制在队列中,排队导出PDF报告(最长导出PDF报告也就2min),让Python脚本异步调用去消费这些任务,但问题就出在这个Python多线程脚本上,由于现有业务将这个单纯的调用PHP导报告脚本加了很多的逻辑,导致脚本在crontab脚本的控制下,间断性存在脚本卡死,僵死状态,影响到任务的执行,为了解决这个问题,特进行了分析处理,给出了相应的方案;

其实Python脚本那块的逻辑还有待优化空间,此文只介绍针对脚本卡死僵死进程进行处理;


问题总结:

1、卡死的脚本的情况
在这里插入图片描述

2、问题:由于只是通过脚本监听,但是卡死的脚本还是存在,就无法继续启动新脚本跑任务,造成任务堆积,无法消费情况;

*/1 * * * * /usr/gk_script/auto_pdf/start.sh > /usr/gk_script/auto_pdf/cron.log 2>&1

详情如下:
#自动化导报告程序启动脚本
isRun=$(ps -ef | grep auto_pdf/main.py | grep -v grep | awk '{print $2}')
if [ "" == "$isRun" ]; then
	/usr/local/bin/python3.8 /usr/gk_script/auto_pdf/main.py
fi

3、对比查一个正常运行的脚本情况
在这里插入图片描述

解决方案:

1、linux调度任务流程图
在这里插入图片描述

2、先看到脚本罗出来的表头说明

  • USER:该进程属于那个使用者账号。 —root
  • PID :该进程的进程ID号。 —5882
  • %CPU:该进程使用掉的 CPU 资源百分比; – 0.0
  • %MEM:该进程所占用的物理内存百分比; - 0.3
  • VSZ :该进程使用掉的虚拟内存量 (Kbytes) - 776820
  • RSS :该进程占用的固定的内存量 (Kbytes) - 57528
  • TTY :该进程是在那个终端机上面运作,若与终端机无关,则显示 ?。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。 - ?
  • STAT:该程序目前的状态,主要的状态有: - Sl
    • R :该程序目前正在运作,或者是可被运作;
    • S :该程序目前正在睡眠当中,但可被某些讯号(signal) 唤醒。
    • T :该程序目前正在侦测或者是停止了;
    • Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
    • < 高优先级
    • N 低优先级
    • L 有些页被锁进内存
    • s 包含子进程
    • + 位于后台的进程组;
    • l 多线程,克隆线程 multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
  • START:该进程被触发启动的时间; - Jun23
  • TIME :该进程实际使用 CPU 运作的时间。 - 0:01
  • COMMAND:该程序的实际指令。 - /usr/local/bin/python3.8 /usr/gk_script/auto_pdf/main.py

3、对比详细的参数发现,如果脚本卡死,cpu占用率为0.0,这个就是我们的突破口,进行进一步判断;

4、修改脚本如下:

#!/usr/bin/bash

#自动化导报告程序启动脚本
isRun=$(ps -aux | grep auto_pdf/main.py | grep -v grep | awk '{print $2}')
cpu=$(ps -aux | grep auto_pdf/main.py | grep -v grep | awk '{print $3}')

# []内容前后必须有空格
if [ "" == "$isRun" ]; then
    /usr/local/bin/python3.8 /usr/gk_script/auto_pdf/main.py
elif [ "0.0" == "$cpu" ];then
    kill -9 "$isRun"
    /usr/local/bin/python3.8 /usr/gk_script/auto_pdf/main.py
else
    echo "自动化报告脚本正常运行"
fi

5、题外话问题对比:

1、tail -f 脚本 和 tail -F 脚本的区别

tail -f filename 我们经常用于查询日志的实时记录;

通过tail --help 查看,官方显示两者命令效果一样,但是我在执行tail -f filename 查日志会报错:tail: /xxx/cron.log: file truncated,与之相反,我使用 tail -F filename 就不报错;

如下网上查到的对比差异:

 -f      The -f option causes tail to not stop when end of file is reached, but rather to wait for additional data to be appended to the input.  The -f option is ignored if the standard input is a pipe, but not if it is a FIFO.

 -F      The -F option implies the -f option, but tail will also check to see if the file being followed has been renamed or rotated.  The file is closed and reopened when tail detects that the filename being read from has a new inode number.  The -F option is
         ignored if reading from standard input rather than a file.

2、linux写shell运行脚本时,经常用的符号 >>>< 区别

  • > 是覆盖原有内容,这种操作能节省空间,但是历史的记录就覆盖了,也可以用于一次性写入,如导出mysql数据表:mysqldump -u用户名 -p 数据库名 > 数据库名.sql
  • >> 追加内容,这种操作会导致日志文件的积压,但是可以方便回溯;
  • < 导出操作,如导入sql的表:mysqldump -u用户名 -p -d 数据库名 > 数据库名.sql
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值