我需要部署一个在特定目录中查找tar文件的自动化进程(通过1分钟的cron脚本)。 如果findtar文件,则解压到适当的位置,然后删除tar文件。
tar文件通过另一台服务器的SSH自动复制到该服务器。 在某些情况下,tar文件非常大,有很多文件。
我期望遇到的问题:如果将tar文件复制到服务器需要1分钟以上,并且cron脚本每分钟运行一次,则会看到.tar.gz文件并尝试执行解压缩它,即使tar文件仍在写入过程中。
有没有什么办法(通过bash命令)来testing当前正在写入的文件,还是只有部分文件等?
我想到的一个select是将文件复制为不同的文件扩展名(如.tar.gz.part ),然后在传输完成后将其重命名为.tar.gz 。 但我想我会试图找出是否有简单的方法来确定文件是否完整的命令行第一…任何线索?
你在正确的轨道上,重命名文件是一个primefaces操作,所以上传后执行重命名是简单,优雅,而不容易出错。 我能想到的另一种方法是使用lsof | grep filename.tar.gz lsof | grep filename.tar.gz来检查文件是否被另一个进程访问。
最好的办法是使用lsof来确定文件是否被任何进程打开:
# lsof -f -- /var/log/syslog COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 1520 syslog 1w REG 252,2 72692 16719 /var/log/syslog
你不能轻易地判断它是否正在写入,但是如果正在写入,它必须是开放的。
编辑:让我们在这里解决实际问题,而不是尝试实施build议的解决scheme!
使用rsync传输文件:
○ → rsync -e ssh remote:big.tar.gz .
这样,文件将不会被复制到现有文件的顶部,而是被复制到临时文件( .big.tar.gz.XXXXXX )中,直到传输完成,然后移动到位。
最好的方法是使用incron (“inotify cron系统”)。 它允许您在目录上设置一个inotify监视,然后通知您文件操作。 在这种情况下,你应该看一下close_write的目录。 这将允许您在写入后closures文件后再运行命令。
看起来lsof可以检测到一个文件打开在什么模式下:
lsof -f -- a_file COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME cat 52391 bob 1w REG 1,2 15 19545007 a_file
看看它说1W? 这意味着文件描述符编号为1,模式为w或写入。