如何防止Base Shell脚本重复执行?

Bash

1 前言

一个问题,一篇文章,一出故事。
笔者最近发现脚本因为重复执行而损耗服务器性能,因此解决此问题而整理本章节。

2 最佳实践

2.1 创建测试脚本

vim ~/scripts/script.sh

加入如下配置,

#!/bin/bash

LOCKFILE="/tmp/script.lock"

# 检查锁文件是否存在
if [ -e "$LOCKFILE" ]; then
    oldPid=$(cat "$LOCKFILE")

    # 检查 PID 是否为空
    if [ ! -z "$oldPid" ]; then
        # 检查进程是否仍在运行
        if ps -p "$oldPid" > /dev/null; then
            echo "Script is already running with PID $oldPid."
            exit 1
        fi
    fi
    rm -f "$LOCKFILE"
fi

# 创建锁文件并写入当前进程的 PID
echo $$ > "$LOCKFILE"

# 执行主要任务
echo "Running the script..."
# 示例命令
sleep 30  # 模拟长时间运行的任务

# 清理锁文件
rm -f "$LOCKFILE"
exit 0

2.2 执行测试脚本

bash ~/scripts/script.sh
没有评论

发表回复

Bash
如何根据条件输出MySQL表Insert行?

1 前言 一个问题,一篇文章,一出故事。 笔者执行NextCloud的维护任务,需要从数据表中删除用 …

Bash
如何函数代替Base Shell的命令别名?

1 前言 一个问题,一篇文章,一出故事。 之前的章节我们使用命令别名来缩写输入的命令,相见如下, 如 …

Bash
如何监视服务并自动通知?

1 前言 一个问题,一篇文章,一出故事。 最近笔者希望通过脚本实现监视服务并在服务异常是使用两种方式 …