${T-6ren">
gpt4 book ai didi

linux - 防止文件被linux中的另一个进程移动

转载 作者:太空宇宙 更新时间:2023-11-04 09:01:59 25 4
gpt4 key购买 nike

我对 bash 脚本有疑问。我有两个 cron 任务,它们从同一文件夹中获取一些文件以进行进一步处理。

ls -1h "targdir/*.json" | head -n ${LIMIT} > ${TMP_LIST_FILE}
while read REMOTE_FILE
do
mv $REMOTE_FILE $SCRDRL
done < "${TMP_LIST_FILE}"
rm -f "${TMP_LIST_FILE}"

但是随后两个脚本实例同时运行,相同的文件被移动到 $SRCDRL,这对于实例来说是不同的。问题是如何防止文件被不同的脚本移动?

更新:也许我有点不清楚...我有存储 json 文件的文件夹“targdir”。我有两个 cron 任务,它们从该目录中获取一些文件进行处理。例如,在 targdir 中存在 25 个文件,第一个 cron 任务应该获取前 10 个文件并将它们移动到/tmp/task1,第二个 cron 任务应该获取接下来的 10 个文件并将它们移动到/tmp/task2,等等。但现在前 10 个文件移动到/tmp/task1 和/tmp/task2。

最佳答案

首先也是最重要的:重命名是原子的。一个文件不可能被移动两次。其中一个移动将失败,因为该文件不再存在。如果脚本并行运行,两者都列出相同的 10 个文件,而不是前 10 个文件移动到 /tmp/task1,接下来的 10 个文件移动到 /tmp/task2,您可能会得到4 个移动到 /tmp/task1,6 个移动到 /tmp/task2。或者可能是 5 和 5 或 9 和 1 或任何其他组合。但是每个文件只会在一个任务中结束

所以没有什么是不正确的;每个文件仍然只处理一次。但这会很低效,因为你可以一次处理 10 个文件,但你只处理了 5 个。如果你想确保在有足够文件可用的情况下始终处理 10 个文件,则必须进行一些同步。基本上有两种选择:

  1. 在列表+副本周围加锁。使用 flock(1) 最容易做到这一点和一个锁定文件。也有两种调用方式:

    1. 通过flock调用整个复制操作:

      flock targdir -c copy-script

      这要求您将应该排除的部分制作成单独的脚本。

    2. 通过文件描述符锁定。在复制之前,做

      exec 3>targdir/.lock
      flock 3

      之后

      flock -u 3

      这让您可以只锁定部分脚本。这在 Cygwin 中不起作用(但您可能不需要它)。

  2. 一个一个地移动文件,直到你有足够的。

    ls -1h targdir/*.json > ${TMP_LIST_FILE}
    # ^^^ do NOT limit here
    COUNT=0
    while read REMOTE_FILE
    do
    if mv $REMOTE_FILE $SCRDRL 2>/dev/null; then
    COUNT=$(($COUNT + 1))
    fi
    if [ "$COUNT" -ge "$LIMIT" ]; then
    break
    fi
    done < "${TMP_LIST_FILE}"
    rm -f "${TMP_LIST_FILE}"

    mv 有时会失败,在这种情况下,您不计算文件并尝试移动下一个文件,假设 mv 失败是因为文件同时被其他剧本感动。每个脚本最多复制 $LIMIT 个文件,但可能是随机选择。

附带说明一下,如果您不是绝对需要在 while 循环中设置环境变量,则可以不使用临时文件。简单地:

ls -1h targdir/*.json | while read REMOTE_FILE
do
...
done

您不能将变量传播出此类循环,因为作为管道的一部分,它在子 shell 中运行。

如果你确实需要设置环境变量并且可以忍受专门使用 bash(我通常会尝试坚持使用 /bin/sh),你也可以这样写

while read REMOTE_FILE
do
...
done <(ls -1h targdir/*.json)

在这种情况下,循环在当前 shell 中运行,但这种重定向是 bash 扩展。

关于linux - 防止文件被linux中的另一个进程移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19497074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com