确保 Linux 上只有一个 Bash 脚本实例在运行
简介
在 Linux 上运行 bash 脚本时,务必确保同一时间只有一个脚本实例在运行。这对于执行关键任务的脚本尤其重要,例如更新数据库的脚本或发送电子邮件的脚本。同时运行同一脚本的多个实例可能会导致冲突、数据丢失和其他错误。在本文中,我们将讨论不同的方法来确保 Linux 上只有一个 bash 脚本实例在运行。
使用 Flock
确保 Linux 上只有一个 bash 脚本实例在运行的一种方法是使用 "flock" 命令。 flock 命令用于锁定文件,它是大多数 shell(例如 Bash、Zsh 等)的内置命令。它是一种简单有效的方法,可以确保每次只运行一个脚本实例。
我们可以信赖这种方法,因为它不会出现竞争条件。此外,文件上的所有锁定都会在进程完成后释放。这些优势使 flock 成为一种确保仅运行一个实例的安全方法。另一个优势是 flock 程序是 flock 系统调用的实现。
flock 默认情况下会阻塞,直到锁定被释放,然后继续运行而不会出现错误。我们可以使用 "-n" 参数以非阻塞方式使用 flock。当文件上还有另一个锁时,这将导致 flock 立即退出并出现错误。
我们可以使用 flock 运行外部脚本,也可以在脚本内部使用它。
运行外部脚本
我们可以在这样的脚本中使用 flock -
$ flock -n /var/lock/dobackup.lock ./dobackup.sh
现在假设我们的脚本正在运行。让我们看看如果再次执行上一行会发生什么 -
$ flock --verbose -n /var/lock/dobackup.lock ./dobackup.sh flock: failed to get lock $ echo $? 1
我们可以看到,flock 通知我们无法获取锁,并退出并返回值 1(错误)。这意味着另一个实例拥有该锁。
当 flock 失败时,它不会运行脚本参数,从而阻止多个"dobackup.sh"实例运行。
在脚本中使用 Flock
我们可以像这样在脚本中使用 flock -
#!/bin/bash
another_instance()
{
echo "There is another instance running, exiting"
exit 1
}
( flock -n 100 || another_instance DEST=/home/backup/`date +%s` mkdir -p "$DEST" rsync -avz root@host:/home/web "$DEST/." ) 100>/var/lock/dobackup.lock
在本例中,我们使用文件描述符调用 flock,并将需要保护的所有内容括在方括号(子shell)中,然后将其重定向到用作锁的文件。我们在开始时使用重定向中使用的文件描述符调用 flock。因此,如果 flock 因错误退出,我们就知道还有另一个实例正在运行。
子级完成后,锁文件将关闭,锁将自动释放。
使用 pid 文件
确保 Linux 上只有一个 bash 脚本实例运行的另一种方法是使用 pid 文件。pid 文件是一个特殊文件,其中包含正在运行的脚本的进程 ID (PID)。通过检查 pid 文件,我们可以确定脚本是否已在运行,如果是,则退出脚本并显示错误消息。
要实现此方法,我们可以在脚本开头添加以下代码 -
if [ -f /path/to/pidfile ]; then
pid=$(cat /path/to/pidfile)
if kill -0 $pid 2>/dev/null; then
echo "Script is already running"
exit 1
else
echo $$ > /path/to/pidfile
fi
else
echo $$ > /path/to/pidfile
fi
此代码检查指定路径中是否存在 pid 文件。如果 pid 文件存在,脚本将从文件中读取 pid,并通过向进程发送空信号 (kill -0) 来检查进程是否仍在运行。如果进程仍在运行,脚本将退出并显示错误消息。如果进程未运行,脚本将使用当前进程 ID 覆盖 pid 文件。如果 pid 文件不存在,脚本将创建该文件并写入当前进程 ID。
在脚本末尾,您可以添加以下代码来删除 pid 文件 -
$ rm -f /path/to/pidfile
结论
确保 Linux 上只有一个 bash 脚本实例运行是一项重要任务,可以防止冲突、数据丢失和其他错误。有几种方法可以实现这一点,例如使用 flock 命令中的锁定文件、使用 pid 文件,或者使用"pgrep"和"kill"命令。每种方法都有其优缺点,最适合您脚本的方法取决于您的具体需求。通过实施其中任何一种方法,您都可以确保脚本顺利运行且不会出现错误。
相关文章
有用资源
linux 参考教程 - 该教程包含有关 linux 的更多信息:https://www.cainiaomax.com/linux/

