我的RedHat服务器中有一些脚本,其中包含Microfocus COBOL程序,平均每3小时产生一个大容量3GB的文件。程序将其输出文件直接写在目录/my_test/files/
。
问题在于,有时(随机)生成的某些文件在文件中间包含空字符部分。当我检查它们时,如果我再次重新执行脚本(使用相同的输入参数),输出文件将完美生成(它不包含任何空值)。我已经检查了很多次,我很确定这不是COBOL程序的错(它们使用非常简单的操作)。该文件夹的使用空间为40%。
某些程序会更新数据库,如果它们以返回代码0结束,那么更改会被提交,并且我没有任何备份,所以这就是我正在做的事情。< / p>
这是一个有问题的COBOL程序的文件声明示例:
FILE-CONTROL.
SELECT MYFILE
ASSIGN TO MYFILE
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD MYFILE
LABEL RECORD STANDARD
RECORDING MODE F.
01 REG-OUTPUT PIC X(400).
我还在NULL文件之前检查了COBOL程序中的空值,但遗憾的是没有发现空值。
然后我考虑创建一个crontab,每隔5秒执行一次以下脚本:
if [[ -f /tmp/sorry_im_working ]]; then
exit
fi
trap 'rm -rf /tmp/sorry_im_working' EXIT
touch /tmp/sorry_im_working
lsof | awk 'BEGIN{
sfiles="";
} {
if($1=="PROGRAM" && $9~/my_test\/files/){
sfiles=sfiles" "$9
}
}END{
comm="find "sfiles" -newermt \x27-2 seconds\x27 -exec env LC_ALL=C bash -c \x27grep -Pq \x22\x5Cx00{200}\x22 <(tail -c 1000 {}) && echo {}\x27 \x5C\x3B";
while(comm | getline sout){
print sout;
};
close(comm);
}' >> /home/ouhma/nullfiles.txt
因此,我想问你以下问题:
答案 0 :(得分:0)
如果构建仅包含\ x00:
的文件dhexdump -C d
00000000 5c 78 30 30 0a |\x00.|
00000005
和你:
grep -Faq '\x00' d;echo $?
0
但是他们在d内没有空洞。
也许,最好使用grep -Paq '\x00'
答案 1 :(得分:0)
根据用于文件的配置和记录结构,MF将使用hex null填充不同的字符。
请复制COBOL程序的'ASSIGN'子句和'FD'子句。
BTW:如果您的COBOL程序运行三个我们做一些计算并写回三GB数据,您应该调查存储和/或让COBOL程序员检查程序,听起来要慢得多。答案 2 :(得分:0)
我怀疑你的文件中有不可打印的字符,可以控制空插入,看看@ INSERTNULL文件配置。