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

  

最新文章

  1. chm文件打开,有目录没有内容
  2. AngularJS(3)-过滤器
  3. Java笔记(二十九)……网络编程
  4. linux 简单命令
  5. Linux 环境变量 $PATH
  6. MyEclipse 8.0注冊码+原版下载_Java开发软件
  7. 使用命令行将Excel数据表导入Mysql中的方法小结
  8. Java Executor 框架
  9. 【python基础】 Tkinter 之 几何管理器
  10. ios9 safari currentTime audio bug
  11. LINUX更改桌面的分辨率
  12. C# 从配置文件中读取/写入信息
  13. iOS动画学习
  14. pymysql 数据库编程
  15. git库初次下载
  16. 再谈git的http服务-权限控制hooks版
  17. 【刷题】UOJ #274 【清华集训2016】温暖会指引我们前行
  18. DNS记录类型名单
  19. gulp报错160
  20. 源码安装git

热门文章

  1. 亲测有效! Scrutiny 网站SEO检测及优化工具 V12.6.1 for mac
  2. P29_全局配置 - window - 导航栏
  3. element el-table固定列凹陷问题
  4. JZOJ 3448.公路维护
  5. Prometheus插件安装(cadvisor)
  6. 基于C++的OpenGL 07 之颜色
  7. Collection集合类(Java)
  8. 【C#异步】异步多线程的本质,上下文流转和同步
  9. vue模板三目运算判断报错
  10. Fun Day