如何避免shell脚本被同时运行多次

2023-05-16

转自:http://www.etwiki.cn/linux/2786.html

比如说有一个周期性(cron)备份mysql的脚本,或者rsync脚本,

如果出现意外,运行时间过长,
很有可能下一个备份周期已经开始了,当前周期的脚本却还没有运行完,
显然我们都不愿意看到这样的情况发生。

其实只要对脚本自身做一些改动,就可以避免它被重复运行。


#!/bin/bash

LOCK_NAME="/tmp/my.lock"
if [[ -e $LOCK_NAME ]] ; then
echo "re-entry, exiting"
exit 1
fi

### Placing lock file
touch $LOCK_NAME
echo -n "Started..."

### 开始正常流程
### 正常流程结束

### Removing lock
rm -f $LOCK_NAME

echo "Done."
 

当脚本开始运行时, 创建 /tmp/my.lock文件,
这时如果再次运行此脚本,发现存在my.lock,就退出,
脚本运行结束时删除这个文件。

大多数情况下,这样做都没有什么问题。
意外1) 如果同时运行二次此脚本, 二个进程都会发现my.lock不存在,然后都可以继续执行。
意外2) 如果脚本在运行过程中意外退出, 没有来得及删除 my.lock文件, 那么就悲剧了。

修改如下:


#!/bin/bash

LOCK_NAME="/tmp/my.lock"
if ( set -o noclobber; echo "$$" > "$LOCK_NAME") 2> /dev/null; 
then
trap 'rm -f "$LOCK_NAME"; exit $?' INT TERM EXIT

### 开始正常流程
### 正常流程结束

### Removing lock
rm -f $LOCK_NAME
trap - INT TERM EXIT
else
echo "Failed to acquire lockfile: $LOCK_NAME." 
echo "Held by $(cat $LOCK_NAME)"
exit 1
fi



echo "Done."
 

set -o noclobber 的意思:


If set, bash does not overwrite an existing file with the >, >&, and <> redirection operators.
 

这样就能保证my.lock只能被一个进程创建出来。比touch靠谱多了。

trap 可以捕获各种信号,然后做出处理:
INT 用来处理 ctrl+c取消脚本执行的情况。
TERM 用来处理 kill -TERM pid 的情况。
EXIT 不清楚

另外,对于 kill -9 无效。。

还记得N年前,在php群里面,草人也问过这个问题,
我们给的答案是 ps aux|grep filename |wc -l ,哈哈,真2。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免shell脚本被同时运行多次 的相关文章

  • c++好用的网站

    目录 洛谷www luogu com cn 有道小图灵https oj youdao com csp 维基https oi wiki org 信奥赛一本通http ybt ssoier cn 8088 index php 1 xff0c 洛
  • PX4uORB介绍[1]-常见IPC机制

  • ubuntu修改.bashrc文件

    使用如下命令修改 bashrc文件 xff1a gedit bashrc
  • PX4中文维基——光流部分

    觉得需要用到的内容复制在下面 光流 官网英文原文地址 xff1a http dev px4 io optical flow outdoors html Optical Flow uses a downward facing camera a
  • px4flow源码分析

    Flow c 计算光流用的是 SAD块匹配算法 第一部分是生成直方图 xff0c 第二部分是根据直方图来进行位移向量的计算 外部的 j i的for循环是采样点的循环 xff0c 内部的jj ii的循环是对于一个小邻域的采样 采样点是从 im
  • sudo apt-get update 与upgrade的用法

    在windows下安装软件 xff0c 我们只需要有EXE文件 xff0c 然后双击 xff0c 下一步直接OK就可以了 但在LINUX下 xff0c 不是这样的 每个LINUX的发行版 xff0c 比如UBUNTU xff0c 都会维护一
  • MATLAB标定工具箱的使用

    MATLAB标定工具箱的使用 用VS2012 43 OpenCV2 4 6写的双目标定的程序 xff08 其实就是跑的Samples xff09 xff0c 实验结果一直很不理想 xff0c 查看很多Blog xff0c 说可以先用MATL
  • C语言中%d,%o,%f,%e,%x的意义

    格式说明由 xff05 和格式字符组成 xff0c 如 xff05 d xff05 f等 它的作用是将输出的数据转换为指定的格式输出 格式说明总是由 xff05 字符开始的 不同类型的数据用不同的格式字符 格式字符有d o x u c s
  • 齐次坐标(homogeneous coordinate)

    就是将一个原本是n维的向量用一个n 43 1维向量来表示 二维点 x y 的齐次坐标表示为 hx hy h 由此可以看出 xff0c 一个向量的齐次表示是不唯一的 xff0c 齐次坐标的h取不同的值都表示的是同一个点 xff0c 比如齐次坐
  • win7下安装Ubuntu双系统(安装详解,及踩过的坑)

    前提 xff1a 网上用的u盘装双系统 xff0c 试了n次不是找到文件就是内存未分配 xff0c 各种错误 xff0c 在网上找相关的错误解决方法 xff0c 发现国内的很少 xff0c 国外的话遇到这种情况的也有 xff0c 也试了 x
  • MATLAB绘制三维曲线进行数据分析

    使用plot3函数 xff0c MATLAB官网教程 xff1a http cn mathworks com help matlab ref plot3 html s tid 61 gn loc drop plot3 x1 y1 z1 39
  • 关于STL的个人看法

    下面说的只是个人对STL的认识 不得不说 xff0c STL确实让数据结构的运用变得很简便 但我看来是有利有弊的 先说好处 xff0c 经过STL封装过的数据结构 xff0c 使用起来更加方便快捷 很多次网络赛 xff0c 用map xff
  • Ubuntu/Windows给pip换源

    文章目录 Windows给pip换源Ubuntu给pip换源 Windows给pip换源 打开appdata文件夹 xff0c 在资源管理器的地址栏输入 appdata 后回车 xff1a 或者win 43 r打开命令运行 xff0c 然后
  • The directory '/home/cds/.cache/pip/http' or its parent directory is not owned by the current user

    使用指令 span class token function sudo span span class token function chown span R root home span class token variable USER
  • window10将wsl升级到wsl2

    文章目录 微软 Win10 版本 2004 系统升级WSL到WSL2第一步 xff1a 打开系统虚拟机平台第二步 xff1a 安装WSL2第三步 xff1a 将wsl2设置为默认 WSL 2 中的新增功能将分发版版本设置为 WSL 1 或
  • conan-c++包管理工具安装及使用指南

    本篇文章的代码都在这里备份 文章目录 一 conan介绍1 1 简单介绍1 2 conna特点1 3 跨平台 二 conan全平台安装三 使用conan教程四 快速总结conan 一 conan介绍 跨平台c c 43 43 包管理工具py
  • C语言中的sizeof和strlen的区别

    sizeof strelen 先说结论 xff0c 喜欢授之以渔的可以看后面结束 1 不同点 sizeof 是单目运算符 xff0c strlen 是函数 sizeof 返回是 字串 字符所在变量 xff0c 实际占用的内存大小 单位是字节
  • adb通过Wi-Fi连接小米手机

    手机设置 打开开发者选项 打开无线调试 选择这里 有了配对密码和地址 xff0c 我们就可以使用shell连接了 shell连接 span class token punctuation span base span class token
  • python多进程教程

    1 进程的概念 进程是计算机中的一个基本概念 xff0c 它是指正在运行的程序的实例 每个进程都有自己的内存空间 代码 数据和文件等资源 xff0c 进程之间相互独立 xff0c 互不干扰 2 多进程编程的优点 多进程编程可以利用多核CPU
  • python多进程教学-超多模版例子代码

    文章目录 Python 多进程教程什么是多进程 xff1f multiprocessing模块的基本用法进程池 多进程例子例子1 xff1a 计算密集型任务例子2 xff1a IO密集型任务例子3 xff1a 共享内存 进程池例子例子1 x

随机推荐

  • 在线运行的Linux环境

    JS UIX Terminal 打开网址 xff1a https www masswerk at jsuix index html 显示以下页面 点击 gt open terminal xff0c 进入终端 xff1a 第一次输入命令 xf
  • python的多任务处理

    在现代计算机系统中 xff0c 多任务处理是一项重要的技术 xff0c 可以大幅提高程序的运行效率 Python语言提供了多种多任务处理的方式 xff0c 本文将介绍其中几种常见的方式 xff0c 包括多进程 多线程和协程 多进程 进程是计
  • sublime text3搭建配置c语言编译环境,详细图解,小白教程!

    软件下载可以在官网下载 xff0c 均为免费软件有问题可以联系我邮箱求助 xff1a sexluna 64 outlook comsublime text3虽然收费但是支持无限期试用且功能不受限制 xff08 免费软件 xff09 使用su
  • matlab2018a安装激活教程

    文件下载 xff1a 2018a中文版 链接 pan baidu com s 1wx1tU8f bufbR76Yo06kMw 提取码 55ii 有问题关注微信公众号 xff1a 性感的小君君 文章目录 安装步骤破解过程 安装步骤 1 鼠标右
  • 绝地求生LowLevelFatalError报错原因

    LowLevelFatalError 低级致命错误通常是游戏本来运行没有任何问题 xff0c 突然有一天 xff0c 游戏开始闪退报错 xff0c 并弹出这个报错 原因 xff1a 一般情况都是因为电脑内存溢出问题导致的 xff0c 不是说
  • 浏览器主页被2345劫持捆绑解决方案---极其简单!

    文章目录 2345的恶名远扬第一步 xff1a 下载修复软件第二步 xff1a 扫描查杀第三步 xff1a 修复查杀漏洞 2019 02 23日 xff0c 我已成功依靠这种方法成功删除2345劫持主页的病毒 xff0c 无毒副作用 xff
  • VR直播的技术难点

    2016 年 xff0c 互联网上有两样很火 xff0c 一是 VR 二是直播 xff0c 随着 直播 43 模式的普及 xff0c VR 43 直播 VR 直播也开始兴起 VR 技术多用于游戏 电影 甚至 产业 xff08 国外 xff0
  • RealSense D435深度相机开发(一)---- 基础介绍

    nbsp nbsp nbsp nbsp 最近项目要用到深度相机 首先进行了选型 参见上篇博客https blog csdn net SFM2020 article details 83002133 通过各种深度相机对比 最终选择了intel
  • 工程师淘金:开发Android主攻四大方向

    苹果 Apple 公司的应用程序商店 app store 和谷歌 google Android都为大家提供了更加容易赚钱的机会 xff0c 但是我认为 xff0c 为苹果应用程序商店开发软件的公司和个人赚的都只是小钱 xff0c 利用And
  • (native:platform) should not link to libxxx (native:vendor)

    system core init Android mk error init native platform should not link to libdrm native vendor system core init Android
  • sensor数据格式

    raw10 一个像素的一个颜色分量 xff0c 占10bit
  • 拆解一探电路设计:小米路由器3C拆解

    前言 xff1a 大二时 xff0c 由于宿舍需要购买了一个小米路由器3C xff0c 现在放在家闲置遂拆解该款路由器一探究竟 一 小米3C基本信息 小米路由器3C作为一款售价99元的跑量级路由器 xff0c 它是否能给我们带来惊喜呢 xf
  • 传参数到已经编译进内核的驱动

    xhci tegra c有如下部分 xff1a static bool en hcd reinit 61 false module param en hcd reinit bool 0644 MODULE PARM DESC en hcd
  • repo拉取tag

    repo init u xxx b refs tags code tag
  • gnutls_handshake() failed问题解决方法

    编译openwrt时候遇到此问题 xff0c 原因貌似是gnutls的协议不支持 xff0c 可以安装openssl来解决此问题 xff1a 下面是网上找到的解决方法 xff1a Got reason of the problem it w
  • 基于openwrt的mqtt的移植

    其实mqtt不需要太复杂的流程 xff0c 进入openwrt xff0c make menuconfig 在lib中选择mosquitto nossl xff0c 然后make V 61 99 xff0c 编译出来以后再openwrt b
  • openwrt单独编译package包

    假设在package network zigbeeservice test目录下是要编译的代码 先make menuconfig 找到对应的选项 xff0c 然后配置该选项为 39 M 39 xff0c 保存退出 然后输入make pack
  • 一个线程创建另一个线程

    线程是不分父子线程的 xff0c 一个线程创建另一个线程 xff0c 尽管第一个线程已经结束 xff0c 第二个线程还是可以照常运行
  • fatal error: mysql.h: No such file or directory

    转自 xff1a http tangmingjie2009 iteye com blog 1521088 我是在Ubuntu系统下测试的 此系统下 xff0c mysql安装 apt get install mysql server 等了有
  • 如何避免shell脚本被同时运行多次

    转自 xff1a http www etwiki cn linux 2786 html 比如说有一个周期性 cron 备份mysql的脚本 xff0c 或者rsync脚本 xff0c 如果出现意外 xff0c 运行时间过长 xff0c 很有