2017-06-21 6 views
-2

私はserverから常にデータを受信して​​いるaccess.logという1つのファイルを持っています。だから、私はaccess.logファイルのデータをいくつかのファイルにコピーする必要があります。 たとえば、スクリプトを実行する場合、データを別のファイルにコピーする必要があります(ファイル名はaccess_1.logにする必要があります)。access.logファイルは切り捨てる必要があります。 2回目に同じスクリプトを実行すると、データはaccess_2.logファイルにコピーされ、access.logファイルは切り捨てられます。したがって、ファイルを10回実行すると、10個のファイルを作成する必要があります。 私はこのスクリプトを試しましたが、カウント値は私のcode.soでは常に増加していません。常にaccess_1.logと同じファイル名を取得し、データも変更しています。以下の要件のためのシェルスクリプト

count=1 
cp access.log access_$count.log 
>access.log 
count=`expr $count + 1` 

私は

+0

を保持する回数あなたはそれを実行して、あなたのコードでは、ループを持っていますか?そうでない場合、「カウント」は意味のある方法でどのように変化しますか? –

+0

logrotateというコマンドを使用します。 –

+0

私はスクリプト作成の初心者です。フルコードを書くことができます –

答えて

0

ここでカウント値が

LOCATION=/path/to/location 
COUNT=`ls $LOCATION/access_*.log | wc -l` 

COUNT=`expr $COUNT + 1` 

cp $LOCATION/access.log $LOCATION/access_$COUNT.log 
>$LOCATION/access.log 
+0

FYI - 'count = $((count + 1))'は、カウンタをインクリメントするためにはるかに効率的な方法です。 (そして、すべての変数名は悪い習慣です; http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html、第4段落参照)。また、あなたの答えにバグを引用して束縛しています。ファイルを数えるためのベストプラクティスガイダンスについては、[BashFAQ#4](http://mywiki.wooledge.org/BashFAQ/004)を参照してください。 –

1

はこれを試してみて、それが動作するかどうか私に教えて助けてください。

name='access' 
    if [[ -e $name.log ]] ; then 
     i=1 
     while [[ -e $name_$i.log ]] ; do 
      let i++ 
     done 
     name=$name_$i 
    fi 
    cp -r /path/to/access.log "$name".log 
    cat /dev/null > /path/to/access.log 
+0

の「よくお問い合わせいただく質問」セクションをご覧ください。この方法でデータを失うことになります。コピーとトランケートの間に書かれたものはすべて失われます。 –

+0

@MarekVitekどのようにデータがこの方法で失われるのか、彼はすでに彼がaccess.logファイルを切り捨てたいと思っています。コピーと切り捨ての間に書かれたものはどうにか失われるでしょう。 –

+0

彼はデータを別のファイルに移動/コピーしたいからです。しかし、コピー後と切り捨て前にログに書き込まれた項目は、次の番号のログにコピーされません。 –

0
FILE_LOCATION=/path/to/file/ 
FILE_DEST=/second/path/ 

for count in $(seq 1 1000) ;do 
    if [! -e ${FILE_DEST}access_${count}.log ];then 
     cp ${FILE_LOCATION}access.log ${FILE_DEST}access_${count}.log 
     exit 0 
    fi 
done 

$CONFIG_FILEがconfiguratiとファイルへのパスです

logrotate --force $CONFIG_FILE 

logrotateのコマンドを実行しmyprocess.conf

/var/log/access.log { 
     rotate 10 
     weekly 
     postrotate 
      /usr/bin/killall -HUP $myprocess 
     endscript 
    } 

+1

このコードは質問に答えるかもしれませんが、どのようにして問題が解決されたのか、なぜそれが解決されるのかについての追加の文脈を提供すると、回答の長期的価値が向上します。 – Badacadabra

+0

'seq'はbashの一部ではありません。' for((i = 0; i <= 1000; i ++));と書いてください。シェル自体に組み込まれている機能だけを使用します。 http://shellcheck.net/を参照してください。このコードでは、引用符で囲まれたいくつかの誤りを特定します。 –

0

入れ、以下のコンテンツを楽しみますあなたが作成した。 $ myprocessはログに書き込むデーモンの名前です。週単位でログをローテーションします。
すでにマシンにインストールされている設定については、/etc/logrotate.dディレクトリを参照してください。

あなたがまだ納得しておらず、何らかの理由でスクリプトを使いたい場合は、このスクリプトを試してみてください。

last=`ls access_* | sort -n -k 1.8 -r| head -1 | sed -e 's/access_\([0-9]*\).log/\1/'` 
((last += 1)) 
mv access.log access_${last}.log 
killall -HUP myprocess 

最初の行は次のようん:

  • リストをaccess_
  • で始まるすべてのファイルを、それが第一フィールド8文字
  • に数値的にソートし、それが最大の番号を持つ最初の行のみファイルを受け取り
  • 文字列access_123.logから番号を抽出します
関連する問題