diff --git a/shell/只执行一次的定时任务.md b/shell/只执行一次的定时任务.md new file mode 100644 index 0000000..f701978 --- /dev/null +++ b/shell/只执行一次的定时任务.md @@ -0,0 +1,26 @@ +```shell +#!/bin/bash + +# filename: sync.sh + +LOCK_FILE="/tmp/sync.lock" +LOG_FILE="/var/log/sync.log" + +( + flock -n 9 || { + echo "$(date): 已有同步任务在运行,退出。" >> "$LOG_FILE" + exit 0 + } + + if [ -f "/root/abc" ]; then + echo "$(date): 检测到触发文件,开始同步..." >> "$LOG_FILE" + rsync -avP /root/def /data/sync/ >> "$LOG_FILE" 2>&1 + + echo "$(date): 同步完成,移除定时任务。" >> "$LOG_FILE" + crontab -l 2>/dev/null | grep -v "sync.sh" | crontab - + else + echo "$(date): 未检测到触发文件,跳过同步。" >> "$LOG_FILE" + fi +) 9>"$LOCK_FILE" + +``` \ No newline at end of file