ksh - 管道无法写入输出

时间:2014-06-27 16:16:40

标签: pipe ksh tail

我在AIX 6.1下的ksh(而不是ksh93)中使用这一行

# initiate earlier
LineStart=235559
cst_TracorTailLook=128
FileName=/LongPathWithSlash/logs/file.log
# /LongPathWithSlash/logs/file.log -> file_log.27Jun2014-00:00:00
# File is about 250.000 line and 60.000.000 bytes or more 

# the failing line
tail -n +$(( ${LineStart} - ${cst_TracorTailLook} + 1 )) ${FileName} |
    SomeAction

在直接会话中运行,没问题,它返回结果(在管道返回多行之后用wc -l进行测试)但是从代理(Tivoli监视代理程序)运行此行返回:

tail: 0652-046 Cannot write to output.
There is no process to read data written to a pipe.

引用限制我发现代理的限制(ulimit-a)少于直接会话

                     Direct      Agent
time(seconds)        unlimited   unlimited
file(blocks)         unlimited   unlimited
data(kbytes)         131072      unlimited
stack(kbytes)        32768       32768
memory(kbytes)       32768       32768
coredump(blocks)     2097151     unlimited
nofiles(descriptors) 2000        unlimited
threads(per process) unlimited   unlimited
processes(per user)  unlimited   unlimited

我在AIX 5.3上发现了几个关于限制为2 Gb的问题,但这不是大小也不是操作系统版本

最终,是否有替代方案而不通过临时文件?

2 个答案:

答案 0 :(得分:1)

当管道在尾部完成之前完成之后的SomeAction时,您的管道将会断裂。 确保你的SomeAction将等到尾部完成。

答案 1 :(得分:1)

确保代理程序调用的脚本在10秒内完成。 拖曳大型日志文件应该在代理商“外部”进行。 你说crontab在这里是不可能的,也许你可以解雇后台进程:

LASTRESULT="cat ${ResultAction}"
nohup SomeAction > ${ResultAction} 2>&1 &

当然,这种方式您的代理没有最新结果,因此请注意经常启动代理。不常见的是,您不希望并发(后台)进程扫描您的输出。 (也请在当前的解决方案中查看)。

您可以使监控的日志文件变小吗?关闭调试日志记录或更频繁地旋转文件?在每次日志操作之后,正在编写日志文件的程序是否关闭了filedescriptor?

timestamp=${your_layout_yyyymmdd_hhmm}
mv ${FileName} ${FileName}.${timestamp}
touch ${FileName}
# I think Now you do not want to use a 
# tail -n +${offset} ${FileName}.${timestamp} | SomeAction
# and you are happy with
cat ${FileName}.${timestamp} | SomeAction
相关问题