我在脚本中运行此命令
while [ 1 ]
do
if [ -e $LOG ]
then
grep -A 5 -B 5 -f $PATTERNS $LOG >> $FOREMAIL
break
fi
done
$ LOG文件是从另一台机器scp的。因此,只要它出现在当前目录中,while循环就会检测到它并执行grep。问题是,$ FOREMAIL文件变为空。但是如果我在脚本之外运行这个grep作为具有相同文件和参数的独立命令,我可以看到它生成一个输出。
我很困惑为什么这个命令在脚本中没有生成o / p?
答案 0 :(得分:5)
一旦scp 创建文件,-e就会触发,而它仍然没有数据,而grep正在空文件上运行。您需要等到文件传输完毕。
您可以通过转移到临时文件名来完成此操作,而不是从正在推送文件的计算机上通过ssh运行mv。
编辑:机器复制到日志文件的代码...
scp $log 192.168.0.1:/logfiles/${log}.tmp
ssh 192.168.0.1 mv /logfiles/${log}.tmp /logfiles/${log}
答案 1 :(得分:2)
在你可以grep之前,你需要等待两件事:1)下载开始(文件出现)和2)下载完成(没有人再打开文件)。我有一个脚本调用waitfor.sh,它执行此操作:
#!/bin/bash
# waitfor.sh - wait for a file fully downloaded (via Firefox, scp, ...)
# Syntax:
# waitfor.sh filename
FILENAME=$1 # Name of file to wait for
INTERVAL=10 # Wait interval of N seconds
# Wait for download started
while [ ! -f $FILENAME ]
do
sleep $INTERVAL
done
# Wait for download finished
while lsof $FILENAME
do
sleep $INTERVAL
done
使用它:
waitfor.sh $LOG
grep ...
答案 2 :(得分:1)
可能是while [1]非常快,所以当文件开始复制时,它在复制完成之前首先显示为空文件?根据文件的大小,在then循环内尝试睡眠延迟。当外部进程完成文件完成复制时,确定可能是一个单独的问题 - 例如谷歌搜索“如何告诉scp复制文件的时间”这样的内容会出现一堆链接,如:https://superuser.com/questions/45224/is-there-a-way-to-tell-if-a-file-is-done-copying
答案 3 :(得分:0)
最好使用:
if [ -f $LOG ]
而不是:
if [ -e $LOG ]
答案 4 :(得分:0)
这是我最终做的事情:
scp $ LOGFILE
然后
scp $ SCPDONE#empty file
并修改了if子句:
while [ 1 ]
do
if [ -e $SCPDONE ]
then
grep -A 5 -B 5 -f $PATTERNS $LOG >> $FOREMAIL
break
fi
done