我有一个 cron 脚本,每 5 分钟运行一次,从远程系统获取数据,并且它按预期工作。我的问题是,有时任务需要超过 5 分钟,这意味着我在旧任务完成之前启动了新任务。所以我想知道我是否可以检查,如果可以,在启动新任务之前如何检查旧任务是否仍在运行。我猜基本 id 是创建一个文本文件,并在其中有一个值,例如 true 或 false,然后在运行它之前检查它是 true 还是 false,如果为 false,则更新为 true 并运行,如果为 false,则终止并等到下一次运行
答案1
您不必在文件中输入任何值。一个空文件就可以了。只需检查文件是否存在。如果文件存在,则退出脚本。否则,创建文件,获取数据,并在所有数据获取完成后删除文件。
示例代码
如果另一个实例正在运行,则下面的脚本将退出。这是通过创建一个临时的“锁定文件”来实现的,该文件仅在脚本运行时存在。
脚本的第一部分检查锁文件是否存在,如果锁文件存在则停止,而不执行任何其他操作。
脚本的第二部分完成所有工作。
#!/bin/bash
LOCK="/home/$USER/bin/fetch.lock"
if [ -f "$LOCK" ]; then
echo "Another instance of $0 is running, exiting..."
exit 1
fi
touch $LOCK # Creates the file
trap "rm $LOCK" EXIT
echo "Fetch data"
sleep 1m # wait for 1 minute for testing
echo "Done fetching data"
注意,如果脚本被Ctrl+中断C或者脚本正常结束时,trap 命令将删除锁文件。
此示例脚本不会获取任何数据。它只显示“获取数据”字样,等待一分钟,然后显示“数据获取完成”。要让它完成实际工作,用您自己的代码替换以下几行:
echo "Fetch data"
sleep 1m # wait for 1 minute for testing
echo "Done fetching data"
希望这可以帮助