为什么我的某些输出文件中会写有随机空字符?

时间:2016-10-19 17:20:01

标签: linux bash null crontab cobol

我的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

因此,我想问你以下问题:

  1. 知道这里发生了什么?
  2. 您还有其他方法可以触发最新的修改过的文件吗?
  3. 我可以将哪些其他感兴趣的信息添加到我的日志中?

3 个答案:

答案 0 :(得分:0)

如果构建仅包含\ x00:

的文件d
hexdump -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文件配置。