Linux 以下要求的shell脚本

Linux 以下要求的shell脚本,linux,shell,unix,sh,Linux,Shell,Unix,Sh,我有一个名为access.log的文件,它总是从服务器接收数据。因此,我需要将access.log文件的数据复制到多个文件中,而不影响任何文件中的数据。 例如:如果我执行脚本,需要将数据复制到另一个文件中(文件名应该是access_1.log),access.log文件应该被截断。如果我第二次执行相同的脚本,数据应该复制到access_2.log文件,access.log文件应该被截断。因此,如果运行该文件10次,则需要创建10个文件。 我在下面的脚本中尝试了这个方法,但是我的代码中的计数值并没

我有一个名为access.log的文件,它总是从服务器接收数据。因此,我需要将access.log文件的数据复制到多个文件中,而不影响任何文件中的数据。 例如:如果我执行脚本,需要将数据复制到另一个文件中(文件名应该是access_1.log),access.log文件应该被截断。如果我第二次执行相同的脚本,数据应该复制到access_2.log文件,access.log文件应该被截断。因此,如果运行该文件10次,则需要创建10个文件。 我在下面的脚本中尝试了这个方法,但是我的代码中的计数值并没有增加。所以总是得到与access_1.log相同的文件名,数据也会发生变化

count=1
cp access.log access_$count.log
>access.log
count=`expr $count + 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

享受

将以下内容放入myprocess.conf

   /var/log/access.log {
       rotate 10
       weekly
       postrotate
           /usr/bin/killall -HUP $myprocess
       endscript
   }
然后运行logrotate命令

logrotate --force $CONFIG_FILE
其中,
$CONFIG_FILE
是您创建的配置文件的路径。$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\开头的所有文件
  • 然后在第1个字段第8个字符上进行数字排序
  • 然后它只需要第一行文件中的最大数字
  • 然后从字符串access_123.log中提取数字

在这里,您运行它多少次,计数值将被保留

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

你的代码有循环吗?如果没有,那么
count
将如何以有意义的方式进行更改?使用名为logrotate的命令。我对脚本编写不熟悉。请您编写完整的代码。这里是一个如何使用它的方法。您还可以移动该文件,然后向守护进程发送HUP信号,以写入该日志
kill-HUP
有人能告诉我为什么这个问题会被-2否决吗?这样会丢失数据。在复制和截断之间写入的任何内容都将丢失。@MarekVitek如何以这种方式丢失数据,因为他已经提到他要截断access.log文件,你能提出更好的建议吗?因为我认为在使用脚本旋转日志时,在复制和截断之间写入的任何内容都将丢失。因为他希望数据被移动/复制到另一个文件。但在复制之后和截断之前写入日志的项目不会复制到下一个编号的日志。@MarekVitek有比这更好的方法吗?因为我认为在使用脚本旋转日志时,在复制和截断之间写入的任何内容都会丢失。最好先执行
mv access.log access1.log
然后执行
kill-HUP
wherepid是守护进程写入日志文件的pid。这将迫使它重新读取配置并重新打开文件,从而开始写入新的access.log,而这段代码可能会回答这个问题,提供关于如何和/或为什么解决这个问题的额外上下文,这将提高答案的长期价值。
seq
不是bash的一部分——最好为((i=0;如果i--
count)编写
=$((count+1))
是一种更有效的递增计数器的方法。(所有caps变量名都是错误的做法;请参阅第四段)。您还将大量引用错误传播到您的答案中。有关计数文件的最佳实践指南,请参阅。
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