我需要编写一个 Unix Shell 脚本 tran.sh,将 csv 输入文件从 /exp/files 文件夹移动到 /exp/ready 目录。
/exp/files
csv 输入文件由 FTP 服务器写入文件夹,而我无法轻易更改其行为。在tran.sh
shell 脚本中,我需要确保在将该 csv 输入文件从 /exp/files 目录移动之前,不再有任何其他进程写入该文件。
我该怎么做。
答案1
没有可移植的方法来实现这一点。不过你可以尝试、、、和fuser
其他方法。lsof
inotify
FAM
答案2
尝试使用fuser [FILE]
。如果文件未被使用,它将返回非零。
以下是等待文件准备好移动的一些示例代码:
#!/bin/sh
FROMDIR='/exp/files'
DESTDIR='/exp/ready'
function move_file_if_ready () {
if [ -f "$1" ]; then
while fuser "$1" 2>/dev/null 1>&2 ; do
sleep 1
done
mv "$1" "$DESTDIR"
fi
}
for "$fn" in "$FROMDIR"/*.csv; do
move_file_if_ready "$fn"
done
答案3
你可以使用 lsof
r=$(lsof /exp/files )
if [ ! -z "$r" ] ;then
mv /exp/files/*csv /exp/ready
fi
答案4
我认为,如果不修改创建这些文件的进程,您就无法做到这一点。每当我们的系统中有这样的任务时,我们都会确保创建文件的进程在最后将其设置为可执行文件。因此,将移动或以其他方式进行后续处理的进程可以检查这些文件的可执行位,以确保原始进程已完成对文件的处理。