linux文件锁(保证只能同时启动一个实例,不同时启动多个实例)

文章目录

    • C++
      • 如果程序异常退出,会自动释放锁码?
    • shell脚本
    • python脚本

在这里插入图片描述

C++

可以使用Linux中的进程锁来实现只能启动一个实例的功能。一种常见的方法是使用文件锁(File Locking)。

可以在程序启动时创建一个特定的文件,并尝试对该文件进行加锁。如果加锁成功,则表示程序是第一个实例,可以继续执行。如果加锁失败,则表示已经有一个实例在运行,程序可以选择退出或者进行其他处理。

以下是一个使用文件锁的示例代码,使用C语言编写:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/file.h>

int main() {
    // 打开一个特定的文件
    int fd = open("/tmp/my_program.lock", O_RDWR | O_CREAT, 0644);
    if (fd == -1) {
        perror("open");
        exit(1);
    }

    // 尝试对文件加锁
    int ret = flock(fd, LOCK_EX | LOCK_NB);
    if (ret == -1) {
        printf("Another instance is already running.\n");
        exit(0);
    }

    // 加锁成功,程序继续执行
    printf("Running...\n");
    sleep(10);

    // 解锁并关闭文件
    flock(fd, LOCK_UN);
    close(fd);

    return 0;
}

在上面的示例中,程序会尝试对/tmp/my_program.lock文件进行加锁。如果加锁成功,则表示程序是第一个实例,可以继续执行。如果加锁失败,则表示已经有一个实例在运行,程序会输出提示信息并退出。

可以将上述代码保存为一个C文件(例如single_instance.c),然后使用以下命令编译并生成可执行文件:

gcc single_instance.c -o single_instance

然后,可以运行生成的可执行文件,只能启动一个实例:

./single_instance

如果尝试再次运行该可执行文件,会输出提示信息并退出。

如果程序异常退出,会自动释放锁码?

如果程序异常退出,操作系统会自动释放文件锁。这是因为文件锁是与文件描述符关联的,当文件描述符关闭时,文件锁也会被释放。

在上述示例代码中,当程序正常退出时,会显式地解锁并关闭文件描述符,这是为了确保文件锁被正确释放。但是,如果程序异常退出(例如由于信号中断或崩溃),操作系统会自动关闭文件描述符,并释放文件锁。

因此,无论程序是正常退出还是异常退出,文件锁都会被正确释放。这样可以确保下次运行程序时,能够再次获得文件锁。

shell脚本

在Shell脚本中,可以使用文件锁的概念来实现只能启动一个实例的功能。一种常见的方法是使用flock命令。

flock命令可以对文件进行加锁,如果加锁成功,则表示程序是第一个实例,可以继续执行。如果加锁失败,则表示已经有一个实例在运行,程序可以选择退出或者进行其他处理。

以下是一个使用flock命令的示例代码:

#!/bin/bash

# 尝试对文件加锁
exec 200>/tmp/my_script.lock
flock -n 200 || { echo "Another instance is already running."; exit 0; }

# 加锁成功,程序继续执行
echo "Running..."
sleep 10

# 解锁并关闭文件描述符
flock -u 200
exec 200>&-

在上面的示例中,程序会尝试对/tmp/my_script.lock文件进行加锁。如果加锁成功,则表示程序是第一个实例,可以继续执行。如果加锁失败,则表示已经有一个实例在运行,程序会输出提示信息并退出。

可以将上述代码保存为一个Shell脚本文件(例如single_instance.sh),然后使用以下命令给脚本文件添加执行权限:

chmod +x single_instance.sh

然后,可以运行该脚本文件,只能启动一个实例:

./single_instance.sh

如果尝试再次运行该脚本文件,会输出提示信息并退出。

python脚本

在Python脚本中,可以使用文件锁的概念来实现只能启动一个实例的功能。一种常见的方法是使用fcntl模块。

以下是一个使用fcntl模块的示例代码:

import fcntl
import os

# 打开一个特定的文件
lock_file = open('/tmp/my_script.lock', 'w')

# 尝试对文件加锁
try:
    fcntl.flock(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
    print("Another instance is already running.")
    exit(0)

# 加锁成功,程序继续执行
print("Running...")
os.sleep(10)

# 解锁并关闭文件
fcntl.flock(lock_file, fcntl.LOCK_UN)
lock_file.close()

在上面的示例中,程序会尝试对/tmp/my_script.lock文件进行加锁。如果加锁成功,则表示程序是第一个实例,可以继续执行。如果加锁失败,则表示已经有一个实例在运行,程序会输出提示信息并退出。

可以将上述代码保存为一个Python脚本文件(例如single_instance.py),然后使用以下命令运行该脚本文件:

python single_instance.py

如果尝试再次运行该脚本文件,会输出提示信息并退出。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

54、Mysql索引的数据结构,各自优劣

Mysql索引的数据结构&#xff0c;各自优劣 索引的数据结构和具体存储引擎的实现有关在MySQL中使用较多的索引有Hash索引&#xff0c;B树索引等InnoDB存储引擎的默认索引实现为: B树索引。对于哈希索引来说&#xff0c;底层的数据结构就是哈希表&#xff0c;因此在绝大多数需求…

Jmeter四种关联方法讲解

目录 方法一&#xff0c;从前一个请求中取&#xff0c;用正则表达式提取器。 二、json path extractor 三、json extractor 四、XPath Extractor 方法一&#xff0c;从前一个请求中取&#xff0c;用正则表达式提取器。 具体方法&#xff0c;在需要获得数据的请求上右击添加…

python+selenium进行cnblog的自动化登录测试

Web登录测试是很常见的测试&#xff0c;手动测试大家再熟悉不过了&#xff0c;那如何进行自动化登录测试呢&#xff01;本文就基于pythonselenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动化登录测试&#xff0c;可提供点参考&#xff01;下面就包括测试代…

出海企业系列风险分析--网站需要验证码吗?

最近接待了几位从discuz来的用户&#xff0c;说是想要给自己海外的网站安装验证码&#xff0c;但是discuz境外服务器还要解析安装中心的DNS到境外服务器上&#xff0c;所以基于discuz建站的不好之处就在这里。 而且我们还讨论到一个问题&#xff0c;海外的网站&#xff0c;需要…

你知道mp3转换器怎么用吗?分享在线音频转换mp3怎么弄

飒飒&#xff1a;嘿&#xff0c;你有没有想过如何将在线音频转换为mp3格式&#xff1f; 潇潇&#xff1a;是的&#xff0c;我确实有过这个需求。在网上找到了一些工具和方法&#xff0c;可以帮助我们完成这个任务。 飒飒&#xff1a;那太好了&#xff01;你能告诉我一些详细的…

JS代码加密技术:僵尸代码植入

JS混淆加密&#xff1a;僵尸代码 僵尸代码植入&#xff0c;是JS混淆加密中一项很有用的技术。 比如JShaman&#xff0c;作为国内知名的JS混淆加密产品&#xff0c;便具备这一功能。 它可以给原始代码中增加一些额代的功能代码&#xff0c;比如&#xff1a;变量定义、函数调用…

Linux dpkg和dpkg-deb常用参数使用说明

名词解释 “dpkg ”是“ Debian Packager ”的简写。为“Debian” 专门开发的套件管理系统&#xff0c;方便软件的安装、更新及移除。所有源自“Debian”的“Linux ”发行版都会使用 “dpkg”&#xff0c;例如 “ Ubuntu ”、“Knoppix ”等。 dpkg-deb和dpkg的区别 dpkg-de…

一次元数据空间内存溢出的排查记录 | 京东云技术团队

在应用中&#xff0c;我们使用的 SpringData ES的 ElasticsearchRestTemplate来做查询&#xff0c;使用方式不对&#xff0c;导致每次ES查询时都新实例化了一个查询对象&#xff0c;会加载相关类到元数据中。最终长时间运行后元数据出现内存溢出&#xff1b; 问题原因&#xf…

Node.js下载安装和环境变量配置(详细教程)

目录 一、官网地址下载安装包 二、安装程序 三、环境配置 四、测试 五、安装淘宝镜像 5.1、附加&#xff1a;如果有出现问题的小伙伴们可以检查一下自己的配置有没有出错 一、官网地址下载安装包 https://nodejs.org/zh-cn/download/ 选择你的项目或系统对应的node.js版本…

Openlayers实战:加载GeoJSON

在OPenlayers的交互中,经常性的我们要加载一些数据,在这个实战中,演示的是加载GeoJSON文件。 GeoJSON 是一种使用JavaScript 对象表示法(JSON) 对地理数据结构进行编码的格式。简而言之,GeoJSON 为你提供了一种简单的格式来表示简单的地理特征以及它们的非空间属性。 效果…

【CentOS安装make】

问题&#xff1a; bash: make: command not found 1、去官网查找最新版本 http://ftp.gnu.org/pub/gnu/make/ 查找最新安装包 2、下载解压缩 wget http://ftp.gnu.org/pub/gnu/make/make-4.2.tar.gz tar -zxvf make-4.2.tar.gz cd make-4.2mkdir buildcd build../configure…

在vite创建的vue3项目中使用Cesium加载czml路径信息和无人机模型

在vite创建的vue3项目中使用Cesium加载czml路径信息和无人机模型 用到的区域文件、地图标记文件、路径信息文件、模型文件 提取码&#xff1a;99jq 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium…

opencv实战--角度测量和二维码条形码识别

文章目录 前言一、鼠标点击的角度测量二、二维码条形码识别 前言 一、鼠标点击的角度测量 首先导入一个带有角度的照片 然后下面的代码注册了一个鼠标按下的回调函数&#xff0c; 还有一个点的数列&#xff0c;鼠标事件为按下的时候就记录点&#xff0c;并画出点&#xff0c;…

uniapp左右滑动切换月份

左右滑动触发事件 给组件绑定事件,主要利用组件的触摸开始和触摸结束事件来实现: <view @touchstart="touchStart" @touchend="touchEnd"> 2,声明初始化点击位置变量startX data() {return {list:[],pageNum:1,pageSize:10,//初始化点击位置…

css之:is()、:where()和:has()伪元素的运用、使用、important

文章目录 简介1、:is()2、:where()3、:has() 简介 :is()、:where()和:has()伪元素是CSS中用于样式化元素的非常强大的工具。它们是在CSS选择器Level4规范中引入的。它们允许我们将样式应用于符合特定条件的任何元素&#xff0c;例如元素的类型、元素的位置和元素的后代。 1、:i…

【C#】并行编程实战:实现数据并行(4)

本章继续学习实现数据并行&#xff0c;本文主要介绍并行循环中的线程存储。这也是本章节的最后一篇。 本教程对应学习工程&#xff1a;魔术师Dix / HandsOnParallelProgramming GitCode 5、了解并行循环中的线程存储 默认情况下&#xff0c;所有并行循环都可以访问全局…

香橙派4和树莓派4B构建K8S集群实践之八: TiDB

目录 1. 说明 2. 准备工作 3. 安装 3.1 参考Tidb官方 v1.5安装说明 3.2 准备存储类 3.3 创建crd 3.4 执行operator 3.5 创建cluster/dashboard/monitor容器组 3.6 设置访问入口(Ingress & Port) 4. 装好后的容器状况 5. 遇到的问题 6. 参考 1. 说明 建立TiDB…

全志F1C200S嵌入式驱动开发(串口驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 对于uboot、kernel和rootfs来说,他们的串口输出一般都是uart0。一般这么做,是没有问题的。只不过我们自己买的这块f1c200s电路板,设计者把uart转ttl的接口,改接到了uart1上面。…

微信小程序下拉选择

微信小程序中下拉框选择一般的交互方式有以下两种 直接下拉选择点击选择框后&#xff0c;弹出浮层进行选择 下边分别介绍两种方式的实现。在微信小程序中&#xff0c;这两种实现都需要修改三个文件 js 文件&#xff1a;下拉选择逻辑的具体实现 wxml 文件&#xff1a;下拉组件…

1、linux中安装tomcat

1、创建目录 cd /opt ls mkdir tomcat 2、将文件拖入tomcat目录中 3、解压安装包 cd /opt/tomcat ls tar -zxvf apache-tomcat-8.5.59.tar.gz 4、启动tomcat cd /opt/tomcat/apache-tomcat-8.5.59/bin ./startup.sh 5、在linux中访问 http://localhost:8080/ 6、开放端口 …