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

文章目录

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

linux文件锁(保证只能同时启动一个实例,不同时启动多个实例)_第1张图片

C++

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

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

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

#include 
#include 
#include 
#include 
#include 

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

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

你可能感兴趣的:(C/C++,Python,shell,linux,服务器,运维)