Bash 脚本:给出错误:gzip:<文件>.conf.gz:文件意外结束

Posted

技术标签:

【中文标题】Bash 脚本:给出错误:gzip:<文件>.conf.gz:文件意外结束【英文标题】:Bash script: gives error: gzip: <File>.conf.gz: unexpected end of file 【发布时间】:2022-01-23 20:22:23 【问题描述】:

我将下面的脚本作为守护进程运行。 它检查上传文件中的新 .g​​z 文件。将它移动到正确的位置 en gzip 的它。

当我手动运行脚本(以 root 身份(坏我))时,它可以工作。当守护进程运行时,它会给出错误

Dec 22 16:56:06 server watchftp.script[131856]: gzip: /var/www/html/config/MER2-SRX.conf.gz: unexpected end of file

我看不出问题出在哪里。还有人吗??

脚本代码:

#!/bin/bash

savedir='/var/www/html/config/'

inotifywait -m /srv/ftp/upload -e create -e moved_to  |
while read dir action file; do
        echo "The file '$file' appeared in directory '$dir' via '$action'"
        #set correct permissions
        chown root:root $dir$file
        chmod 755 $dir$file

        #create new filename and subdirectory name for save location
        newfilename=$( echo -n $file | cut -d '_' -f 1)
        parkdir=$( echo -n $newfilename | cut -d '-' -f 1)

        mv $dir$file $savedir$newfilename.conf.gz

        #check if subdirectory exist otherwise create it
        if [[ ! -d $savedir$parkdir ]]; then
                echo "create directory $savedir$parkdir"
                mkdir $savedir$parkdir
        fi
        gunzip -dc $savedir$newfilename.conf.gz > $savedir$parkdir/$newfilename.conf
done

【问题讨论】:

我猜你是在作者写出所有(甚至可能是任何一个)之前尝试阅读它。尝试以某种方式等到它不再打开 (lsof) 或查看它的大小以确定它何时不再增长。 顺便说一句,可能回顾一下When to wrap quotes around a shell variable? 另外,不要使用echo -n。在某些版本中,这将在末尾打印没有换行符的字符串(您在这里并不真正想要),但在其他版本中,它将在行首打印“-n”(这你真的不想)。实际上,我会用内置替换替换整个 cut 事物:newfilename="$file%%_*"。此外,没有-f-imv 总是让我感到紧张,因为它会默默地删除任何以前使用新名称的文件。 感谢 cmets。我将阅读关于 qoutes @tripleee 的信息。 可能尝试shellcheck.net 来捕捉更多这些常见的初学者错误,包括 Gordon 指出的几个。 【参考方案1】:

您正在处理一个部分写入的文件,因为create 事件将在文件创建后立即触发您的脚本,而不是在他们完成写入后。

请改用close_write 事件。当作者完成文件写入并关闭它时触发。它假定他们不会分批写入文件,但这很不寻常。

所以将-e create 更改为-e close_write

【讨论】:

以上是关于Bash 脚本:给出错误:gzip:<文件>.conf.gz:文件意外结束的主要内容,如果未能解决你的问题,请参考以下文章

检查文件名包含bash脚本中的字符串

《Advanced Bash-scripting Guide》学习(十七):用more来查看gzip文件

用于归档文件然后复制新文件的 Bash 脚本

python没有使用gzip读取gzip文件

Python脚本给出`:没有这样的文件或目录`

Bash脚本函数溢出到其他脚本中