首页 > 系统相关 >shell之flock

shell之flock

时间:2022-09-28 16:55:53浏览次数:48  
标签:shell crontab 任务 实例 flock 执行 php

1、flock

最大的用途就是实现对 crontab 任务的串行化;为了防止crontab 任务出现多实例的情况,导致系统内存被耗尽。

在 crontab 任务中,有可能出现某个任务的执行时间超过了 crontab 中为此任务设定的执行周期,这就导致了当前的任务实例还未执行完成,crontab 又启动了同一任务的另外一个实例

这通常不是用户所期望的行为。极端情况下,如果某个任务执行异常一直未返回,crontab 不会处理这种情形,会继续启动新的实例,而新的实例很可能又会异常,

这样就导致 crontab 对同一任务不断的启动新的实例,最终导致系统内存被耗尽,影响到整个操作系统的运行。为了防止crontab 任务出现多实例的情况,可以使用 flock 命令将crontab 中任务的周期性执行串行化

* * * * * flock -xn /tmp/mytest.lock -c 'php /home/fdipzone/php/test.php'

flock 命令中,-x 表示对文件加上排他锁-n 表示文件使用非阻塞模式-c 选项指明加锁成功后要执行的命令

因而上面flock 命令的整体含义就是:如果对 /tmp/mytest.lock 文件(如果文件不存在, flock 命令会自动创建)加锁成功就执行后面的命令,否则不执行。

假如上面 php 命令要执行2分钟,而crontab 任务每分钟就会执行一次,如果当前 php 命令正在执行,说明 flock 已经锁定了文件 /tmp/mytest.lock,crontab 到了再次执行任务的时间时,会发现文件已经被加了锁。

由于设置的是非阻塞模式的文件锁,flock 会在加锁失败时直接返回,并不执行php 命令,这样就使 php 命令得以顺序执行,crontab 任务就不会出现同时有两个实例运行的情况了,达到了串行化目的。

2、cd $(dirname $0) 的用途

dir=$(cd $(dirname $0);pwd) 常用于打印脚本所在的当前目录

之所以不能直接使用pwd获取脚本所在目录,是因为如果在脚本目录之外调用该脚本,返回的是调用命令所在的目录而不是脚本所在目录。

3、检查用户是root,否则退出脚本的运行

#!/bin/bash

umask 0022
unset IFS  ##unset 删除变量
unset OFS
unset LD_PRELOAD
unset LD_LIBRARY_PATH
export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

if [ -w '/usr' ]; then  #判断是否可写
    installPath="/usr/local/qcloud/stargate"
else
    installPath="/var/lib/qcloud/stargate"
fi
agent_name="$installPath/bin/sgagent"

check_user()   ##检查用户是root,否则退出脚本的运行
{
    if [ "root" != "`whoami`" ]; then
        echo "Only root can execute this script"
        exit 2
    fi
}

check_alive()
{
    status=`ps ax | grep "$agent_name" | grep -v "grep" |wc -l`

    if [ $status -ne 0 ]; then
        # process exist
        echo "stargate agent already exist"
        exit 1
    fi
}

### Main Begin ###

check_user
check_alive
cd $(dirname $0)
export LD_LIBRARY_PATH=$installPath/lib:$LD_LIBRARY_PATH
$agent_name -d

ret=$?
if [ $ret -eq 0 ]
then
    echo "stargate agent run succ"
else
    echo "stargate agent run failed, errcode: $ret"
fi
exit $ret

  

标签:shell,crontab,任务,实例,flock,执行,php
From: https://www.cnblogs.com/dgp-zjz/p/16738691.html

相关文章

  • 报时机器人的rasa shell执行流程分析
      本文以报时机器人为载体,介绍了报时机器人的对话能力范围、配置文件功能和训练和运行命令,重点介绍了rasashell命令启动后的程序执行过程。一.报时机器人项目结构1.......
  • Xshell无法连接22端口问题解决办法汇总
    Xshell软件在进行远程连接过程中,会出现端口连接报错的问题,提示:“该IP地址的22端口连接失败”,这是怎么回事?今天小编就xshell软件无法连接22端口的问题,整理相关情形(ubuntu系......
  • Shell 命令
    set-e与set+e区别https://blog.csdn.net/qq_25518029/article/details/119533509?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog......
  • shell基础知识
    1.1第一个shsh-x1.sh+touch/tmp/1.txt+chmod600/tmp/2.txt+mv/tmp/1.txt/tmp/2.txt1.2脚本执行bash1.sh./1.sh-bash:./1.sh:Permissiondeniedchmod......
  • 设置软件自动启动 win+R shell:startup
    设置软件自动启动win+R输入命令:shell:startup 下载vs2022社区版离线包命令:d:cdvs2022vs_Community.exe--layoutD:\vs2022--addMicrosoft.VisualStudio.Worklo......
  • Linux之Xshell
    shell简介shell的英文含义是“壳”;它是相对于内核来说的,因为它是建立在内核的基础上,面向于用户的一种表现形式,比如我们看到一个球,见到的是它的壳,而非核。Linux中的shell......
  • Linux-->shell
    shell是什么Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序。用户可以用Shell来启动,挂起,停止,编写一些程序。Shell脚本执......
  • shell显示进度条
    【1】参数($0、$?、$*、$@、$#、$$、$!)$0:就是该bash文件名,个位数的,可直接使用数字,但两位数以上,则必须使用{}符号来括住,如${10}.$?:是上一指令的返回值,成功是0,不成功是1......
  • shell基础知识
    1shell脚本结构与执行1.1第一个shsh-x1.sh+touch/tmp/1.txt+chmod600/tmp/2.txt+mv/tmp/1.txt/tmp/2.txt1.2脚本执行bash1.sh./1.sh-bash:./1.sh:P......
  • 尝试阅读理解一份linux shell脚本
    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16721350.html从头一二去阅读语法和命令说明,对于脚本小白来......