如何编写一个脚本,仅当另一个脚本最近运行时才运行?

如何编写一个脚本,仅当另一个脚本最近运行时才运行?

我正在尝试编写两个脚本。但是当我试图阻止其中任何一个连续运行两次时,我遇到了问题。例如,我有 script1 和 script2。我希望当且仅当自上次运行 script1 以来运行 script2 时才能运行 script1。有任何想法吗?

答案1

在脚本 A 中,查看某个文件是否存在,如果不存在,则触摸 /tmp 目录中的文件(例如:touch /tmp/script.lock)并运行代码。然后在脚本B中检查该文件是否存在。如果该文件存在,则运行脚本主体,然后删除该文件。

脚本A:

if [ ! -f /tmp/script.lock ]
then    
    echo hello
    touch /tmp/script.lock
fi

脚本B:

if [ -f /tmp/script.lock ]
then
    echo hello
    rm /tmp/script.lock
fi

答案2

让每个脚本检查某个文件(例如/var/tmp/script1-2)。

如果检查文件不存在,请尽早将其他脚本的名称写入文件中,以防止在该脚本运行时它也运行。

如果它存在并且包含自己的名称,则退出。否则运行正常。

在退出之前,每个脚本都应将自己的名称写入文件中。

CHECKFILE="/var/tmp/script1-2"
MYNAME='script1'
OTHERNAME='script2'
[ ! -s "$CHECKFILE" ] && echo "$OTHERNAME" > "$CHECKFILE"
[ -s "$CHECKFILE" ] && grep -qwF "$MYNAME" && exit 1

# rest of script here
.
.

echo "$MYNAME" > "$CHECKFILE"

选项grep有:

  • -q为了安静,不产生输出
  • -w仅用于匹配整个单词
  • -F用于匹配固定字符串,而不是正则表达式。

注意:如果两个脚本都运行在确切地同时并且 $CHECKFILE 还不存在,那么它们都会运行。无论哪一个最后完成(需要更多时间运行),其名称最终都会写入 $CHECKFILE 中。为了防止这种情况,请echo script2 > /var/tmp/script1-2在运行它们中的任何一个之前运行。

答案3

一种选择是在脚本 1 中运行“date”命令并将此输出重定向到某个文件,例如“file.txt”,然后脚本 2 可以读取此“file.txt”并在该文件之间进行“日期”比较日期和脚本 2 运行的日期? “日期”比较应该相对容易进行 - 网络上有很多示例(我相信)。值得深思。

另一个选择(取决于您的要求)当然是添加“cron”作业条目。

答案4

如果您只想知道 script2 之前是否运行过,请执行以下操作:

在 script2 中的任意位置执行以下操作:

touch .ran_already

现在在 script1 中执行:

if [ -f .ran_already ] then Here comes what the script does.. rm -f .ran_already else echo "script2 didn't run yet!" fi

这对你有好处,尽管它又快又脏。

相关内容