/ / Отримання порожнього файлу для виведення grep - linux, bash, grep, scp

Отримання порожнього файлу для виведення grep - linux, bash, grep, scp

Я виконую цю команду в сценарії

while [ 1 ]
do

if [ -e $LOG ]
then

grep -A 5 -B 5 -f $PATTERNS $LOG  >> $FOREMAIL
break
fi

done

$ LOG файл вилучено з іншої машини. Таким чином, як тільки він з'явиться в поточному каталозі, тоді цикл виявляє його і робить grep. Проблема полягає в тому, що файл $ FOREMAIL виявиться порожнім. Але якщо я запускаю цей grep за межами сценарію як автономну команду з тими самими файлами та параметрами, я бачу, що він генерує вихід.

Я здивований, чому ця команда не генерує жопа в скрипті?

Відповіді:

5 за відповідь № 1

-E запускається як тільки scp створює файл, в той час як у ньому ще немає даних, а grep працює на порожньому файлі. Потрібно зачекати, поки файл не буде переміщений.

Ви можете виконати це, перенести на тимчасове ім'я файлу, ніж запустити mv за ssh від машини, яка натискає файл.

Редагувати: код для машини для копіювання у файл журналу до ...

scp $log 192.168.0.1:/logfiles/${log}.tmp
ssh 192.168.0.1 mv /logfiles/${log}.tmp /logfiles/${log}

2 для відповіді № 2

Перш ніж ви зможете з'їсти, треба чекати двохречі: 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 ...

1 для відповіді № 3

Може бути, що час [1] дуже швидко, такколи файл починає копіювати, воно з'являється як порожній файл перш ніж завершити копіювання? Залежно від розміру файлу спробуйте затримати сну всередині тієї петлі. Виявивши, коли файл закінчує копіювання, коли виконується зовнішнім процесом, це, мабуть, окреме питання - наприклад, Гугллінг для чогось на кшталт "як розповісти, коли scp має finshed копіювання файлу" виявляється купа таких посилань, як: https://superuser.com/questions/45224/is-there-a-way-to-tell-if-a-file-is-done-copying


0 для відповіді № 4

Краще використовувати:

if [ -f $LOG ]

замість:

if [ -e $LOG ]
  • -f перевіряє звичайний тип
  • -е перевіряє будь-який файл

0 для відповіді № 5

Ось що я закінчив робити:

scp $ LOGFILE

потім

SCP $ SCPDONE # порожній файл

І змінити аргумент if:

while [ 1 ]
do

if [ -e $SCPDONE ]
then

grep -A 5 -B 5 -f $PATTERNS $LOG  >> $FOREMAIL
break
fi

done