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

这篇具有很好参考价值的文章主要介绍了linux文件锁(保证只能同时启动一个实例,不同时启动多个实例)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


linux文件锁(保证只能同时启动一个实例,不同时启动多个实例),C/C++,Python,shell,linux,服务器,运维

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

如果尝试再次运行该脚本文件,会输出提示信息并退出。文章来源地址https://www.toymoban.com/news/detail-573607.html

到了这里,关于linux文件锁(保证只能同时启动一个实例,不同时启动多个实例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单例模式:保证一个类只有一个实例

    在软件开发中,有些类 只需要一个实例 ,比如数据库连接池、线程池等。单例模式就是一种设计模式,用于 确保一个类只有一个实例,并提供一个全局访问点 。 1. 饿汉式 饿汉式是最简单的实现方式,它在类加载时就创建了实例,并且提供一个静态方法返回该实例。 jdk源码

    2024年02月14日
    浏览(33)
  • linux c多个线程分段读取一个文件

    在 Linux C 中,你可以使用 pthread 库来创建多线程,并使用文件 I/O 来对文件进行读取和写入操作。以下是一个简单的示例代码,演示如何在 C 语言中开启 8 个线程同时读取一个文件并将其分成 8 段保存到 8 个临时文件中: 在上面的示例中,我们使用了 pthread 库来创建了 8 个线

    2024年02月01日
    浏览(32)
  • Linux--多个源文件编译成同一个可执行文件

    写法一:不推荐 写法二、推荐 $@: 代表目标文件    $^: 代表生成目标文件的所有源文件

    2024年02月15日
    浏览(48)
  • 在linux中怎样同时运行三个微服务保证退出时不会终止

    前言 1.maven中打jar包 使用插件打包,必须在pom.xml中添加插件,否则不能在linux中编译运行 2.将在maven中打包好的文件存放在linux的指定目录中 3.使用命令启动jar包,同时创建记录日志的文件 (在此使用三个微服务为例),只需更换为自己的jar包名称 shop-gateway.jar, shop-order-server.jar, shop

    2024年02月14日
    浏览(33)
  • layui中多个checkbox只能进行单选且一个被选中则取消其他的选中状态

    在layui中,要实现多个checkbox只能进行单选,如果一个被选中,则取消其他的选中状态,可以通过以下步骤实现: 在HTML中,为每个checkbox元素添加相同的class属性,例如\\\"my-checkbox\\\"。 在JavaScript中,使用layui的form模块。通过调用 .on() 方法,绑定对应的触发事件。例如,可以使用

    2024年02月09日
    浏览(42)
  • ROS实现一个节点同时发布订阅多个话题(C++版)

      如果想在一个节点同时发布订阅多个话题就要使用到多线程机制,在C++中如何使用多线程,在C++中开多线程模板已经有了介绍,就是下面这个:    但是有一点需要注意的是,创建节点的涉及到一个主线程,如果想同时发布订阅是不能使用主线程的(也就是不能主线程发

    2024年02月11日
    浏览(30)
  • 在IDEA同一个窗口中同时打开多个独立项目

    不知道大家在使用Intellij Idea的时候,有没有遇到过类似的问题?自己负责了很多项目,使用idea的时候,经常要在不通的项目代码之间切换来切换去。搜索代码的时候只能搜到当前打开的这个项目代码。 因为这些原因,一些零碎的小项目还是得用Eclipse开发。有时候也会用An

    2024年02月14日
    浏览(54)
  • Logstash同时运行多个配置文件

    创建存放logstash配置文件存放目录 修改pipelines.yml进行配置 把所有的配置文件放到 conf.d 目录下面 运行logstash时会读取 conf.d 目录下所有以.conf 结尾的文件 直接运行 不需要指定 -f 参数了

    2023年04月18日
    浏览(32)
  • 前端请求队列,解决多个请求同时请求一个接口导致阻塞的问题

    最近开发的数据大屏项目,使用echarts图表,通过拖拽的方式完成大屏的布局。 每一个图表编写一个vue文件,例如柱状图(barChart.vue): queryEchartsData的方法体如下: 折线图等其他图表同理,都是使用queryEchartsData来获取后端接口返回的数据,queryEchartsData写在queryData.js中,然后

    2024年01月20日
    浏览(35)
  • VSCode同时编译多个C文件

    一.环境说明 1.系统:Ubuntu 22.04.2 LTS 2.Visual Studio Code: 1.80.1 二.问题描述 今天使用VSCode编译《Programming Abstractions In C》书中的gymjudge.c代码时遇到错误,错误提示为: 三.问题分析 因为gymjudge.c文件里面引入了”simpio.c”文件里面“GetReal”、“GetReal”方法,但是我们可以看到错误

    2024年02月15日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包