我正在尝试编写两个脚本。但是当我试图阻止其中任何一个连续运行两次时,我遇到了问题。例如,我有 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
这对你有好处,尽管它又快又脏。