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 【问题描述】:我将下面的脚本作为守护进程运行。 它检查上传文件中的新 .gz 文件。将它移动到正确的位置 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
或-i
的mv
总是让我感到紧张,因为它会默默地删除任何以前使用新名称的文件。
感谢 cmets。我将阅读关于 qoutes @tripleee 的信息。
可能尝试shellcheck.net 来捕捉更多这些常见的初学者错误,包括 Gordon 指出的几个。
【参考方案1】:
您正在处理一个部分写入的文件,因为create
事件将在文件创建后立即触发您的脚本,而不是在他们完成写入后。
请改用close_write
事件。当作者完成文件写入并关闭它时触发。它假定他们不会分批写入文件,但这很不寻常。
所以将-e create
更改为-e close_write
。
【讨论】:
以上是关于Bash 脚本:给出错误:gzip:<文件>.conf.gz:文件意外结束的主要内容,如果未能解决你的问题,请参考以下文章