只在Linux中没有运行的情况下运行Cron作业

只在Linux中没有运行的情况下运行Cron作业

介绍

Cron是Linux中的一个实用程序,它允许用户安排命令或脚本在特定的日期和时间自动运行。然而,有时可能需要确保一个cron作业不会同时运行多次。在本文中,我们将讨论两种防止重叠cron任务的方法:使用流程跟踪和使用”pid”文件。

通过进程定位正在运行的实例

避免cron任务重叠运行的一个方法是在运行前检查任务的进程是否存在。 这可以用pgrep命令来完成,它允许我们搜索具有特定名称的进程并查看其进程ID。 如果找到了该进程,就意味着该任务已经在运行,新的实例不应该运行。

要使用这种方法,我们可以修改cron任务,在开始时包括以下命令—-。

if pgrep -x "script_name" > /dev/null ; then
   exit 0
fi

在上面的命令中,” script_name “是要作为cron job运行的脚本或命令的名称。”-x “选项告诉pgrep要匹配准确的进程名称,而”> /dev/null “部分将输出重定向到null,这样就不会使终端变得混乱。如果脚本已经在运行,if语句将为真,新的实例将关闭而不运行。

例如,如果我们有一个名为 “my_script.sh “的脚本,我们想作为一个cron job运行,我们可以修改cron job,使其包括以下命令 —

if pgrep -x "my_script.sh" > /dev/null ; then
   exit 0
fi

这将在运行cron任务之前检查是否存在 “my_script.sh “进程。如果该进程被发现,新的任务实例将不会运行。

使用一个.pid文件

另一个避免cron任务重叠执行的方法是使用一个”.pid “文件。.pid文件是一个简单的文本文件,它包含一个正在运行的进程的进程ID。当一个任务运行时,它会创建一个带有该任务进程ID的”.pid “文件。如果.pid文件已经存在,说明该任务已经在运行,新的实例不应该运行。

pid_file="/path/to/pid/file/task.pid"
if [ -f "pid_file" ] && kill -0(cat "pid_file") 2>/dev/null; then
    exit 0
fi
echo>"pid_file"

在上述命令中,” pid_file “是指向.pid文件的路径,它应该是运行cron任务的用户的一个可写路径。if语句首先检查.pid文件是否存在,然后使用kill命令向.pid文件中包含的进程ID发送一个信号。选项”-0 “告诉kill发送一个空信号,这实际上并没有杀死该进程,但允许我们检查该进程是否仍在运行。如果进程仍在运行,信号将被成功传递,if语句将为真,这将导致新实例退出而不被执行。如果进程没有运行,信号将不会被传递,if语句将为假,允许任务运行。

if语句的第二行,2>/dev/null,将所有的错误信息重定向到null,这样它们就不会在终端上出现混乱。

在任务运行结束后,必须删除.pid文件,以允许该任务的未来实例运行。这可以通过以下命令完成

$ rm "$pid_file"
pid_file="/tmp/my_script.pid"
if [ -f "pid_file" ] && kill -0(cat "pid_file") 2>/dev/null; then
   exit 0
fi
echo>"pid_file"

这将在”/tmp “目录下创建一个名为 “my_script.pid “的文件,并在其中存储正在运行的任务的进程ID。如果”.pid “文件已经存在,说明该任务已经在运行,新的实例将不会运行。一旦任务运行完毕,”.pid “文件将被删除,允许该任务的未来实例运行。

结论

在这篇文章中,我们讨论了两种防止cron任务重叠执行的方法。第一种方法是在执行活动之前使用进程发现来检查活动进程的存在,第二种方法是使用 ” .pid ” 文件来存储运行的活动进程 ID。这两种方法对于确保一个cron任务一次不会运行超过一次是很有用的,这在任务是资源密集型的或者一次只需要运行一次的情况下是很有用的。需要注意的是,这两种方法都需要对任务脚本本身进行修改,可能不适合所有类型的任务。然而,它们可以成为确保cron任务正确运行的有用工具。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Linux 基础