проблемы объединения файлов с использованием Unix Cat и Zcat в сценарии оболочки - PullRequest
1 голос
/ 18 сентября 2010

У меня проблема с моим сценарием оболочки. Я в основном пытаюсь создать новый файл журнала из (2) файлов с помощью команд Unix (zcat, cat)

FileA = gzipped logfile (.gz)
FileB = non-gzipped log file (.log)

FileC = new file from FileA:FileB

Моя проблема с FileC.

Например: FileA имеет данные метки времени от Aug19-Sept3 FileB имеет данные метки времени от Sept4-Sept17 FileC содержит содержимое обоих файлов = Aug19-Sept3:Sept4-Sept17

Проблема: Если я вручную запускаю команды на сервере, файл выглядит нормально, так как я ожидаю, что FileC будет иметь метки времени из Aug19-Sept17 Но , если это делается программно с помощью сценария оболочки, локальная копия выглядит следующим образом, когда я копирую ее обратно удаленно: FileC = Aug19-Sept17:Aug19-Sept2

Итак, мой вопрос: почему это происходит программно? Есть ли лучший способ объединить / сшить эти 2 журнала вместе, чтобы создать еще один?

Вот мой сценарий оболочки:

#!/bin/bash
if [ $# != 1 ]; then
    echo "Usage: getlogs.sh <remote-host>" 2>&1
    exit 1
fi

#Declare variables
STAMP=`date '+%Y%m%d-%H:%M'`
REMOTE_MYCNF=/var/log/mysoft/mysoft.log
REMOTE_GZ=/var/log/mysoft/mysoft.log.1.gz
REMOTE_DIR=/var/log/mysoft/
BACKUP_DIR=/home/dev/logs/
NEWLOG="foo-temp.log"

#Copy file over
echo "START..." 2>&1
test -f $BACKUP_DIR$1.mysoft.log
if [ $? = 0 ]; then
   echo "Local log file $BACKUP_DIR$1.mysoft.log exists, clean up for new copy..." 2>&1
   /bin/rm $BACKUP_DIR$1.mysoft.log
   else
        echo "File does not exist, getting a new copy..." 2>&1
fi

echo "Checking remotely in $1 for logfile $REMOTE_MYCNF $STAMP" 2>&1
if [ ! -f $REMOTE_MYCNF ]; then
   echo "File exists remotely, creating new logfile and copy here...." 2>&1
   ssh $1 "zcat $REMOTE_GZ >> $REMOTE_DIR$NEWLOG"
   ssh $1 "cat $REMOTE_MYCNF >> $REMOTE_DIR$NEWLOG"
   /usr/bin/scp $1:$REMOTE_DIR$NEWLOG $BACKUP_DIR$1.mysoft.log
   echo "end remote copy" 2>&1
   echo "Cleaning up remote files" 2>&1
   ssh $1 "rm $REMOTE_DIR$NEWLOG"
   exit 0
   else
        echo "Unable to get file" 2>&1
        exit 0
fi

Ответы [ 4 ]

3 голосов
/ 18 сентября 2010

Возможно, возможно, что cat запускается до окончания zcat. Тем не менее, я бы удивился, если бы это было так.

Попробуйте это:

ssh $1 "zcat ... >> ...; cat ... >> ..."

или

ssh $1 "zcat ... >> ..."
sleep 5
ssh $1 "cat ... >> ..."

или

ssh $1 "zcat -f file1 file2 >> ..."   # let zcat do both files
1 голос
/ 27 сентября 2010

Вам вообще не нужно создавать удаленный временный файл.Избавьтесь от нескольких команд ssh, scp и cleanup ssh и попробуйте вместо этого:

ssh $1 "zcat $REMOTE_GZ; cat $REMOTE_MYCNF;" > $BACKUP_DIR$1.mysoft.log

zcat и cat запишут данные в свой стандартный вывод, который подключен к стандартному выводу ssh, который мы перенаправляем в файл.

Я "гарантирую", что zcat запишет все свои данные и завершит работу до того, как cat начнет работу, давая желаемый порядок.«гарантия» заключена в кавычки, потому что должны работать другие решения, о которых не сообщается.

1 голос
/ 18 сентября 2010

Я не могу сразу догадаться, что это за ошибка, но вы пытались упростить свой сценарий оболочки?То есть начните с этого:

#!/bin/sh
STAMP=`date '+%Y%m%d-%H:%M'`
REMOTE_MYCNF=/var/log/mysoft/mysoft.log
REMOTE_GZ=/var/log/mysoft/mysoft.log.1.gz
REMOTE_DIR=/var/log/mysoft/
BACKUP_DIR=/home/dev/logs/
NEWLOG="foo-temp.log"
ssh $1 "zcat $REMOTE_GZ >> $REMOTE_DIR$NEWLOG"
ssh $1 "cat $REMOTE_MYCNF >> $REMOTE_DIR$NEWLOG"

Затем создайте отсюда.Это, по крайней мере, позволит вам изолировать проблему.

0 голосов
/ 23 сентября 2010

Кажется, что временный файл используется повторно, удалите или обрежьте его:

# Always using the same log for new log.
NEWLOG="foo-temp.log"
# Use a new log truncate '>' the old one
ssh $1 "zcat $REMOTE_GZ > $REMOTE_DIR$NEWLOG"
# This time, append '>>' to new log
ssh $1 "cat $REMOTE_MYCNF >> $REMOTE_DIR$NEWLOG"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...