Кто-нибудь может дать мне решение обрезать весь лог-файл в каталоге /var/log/
?
и вопрос только для знаний, хорошая идея или нет?
попробуйте это:
truncate -s 0 /var/log/*log
РЕДАКТИРОВАТЬ:
, если вы хотите сделать это более одного раза, вы должны использовать logrotate
для обработки ваших журналов. Обычно он устанавливается в Ubuntu. Взгляните на man logrotate
(или, если он у вас не установлен, посмотрите на онлайн-страницу руководства или установите его с помощью sudo apt-get install logrotate
)
со страницы руководства:
logrotate разработан для упрощения администрирования систем, которые генерируют большое количество файлов журналов. Это позволяет автоматически вращать, сжимать, удалять и отправлять файлы журналов по почте. Каждый файл журнала может обрабатываться ежедневно, еженедельно, ежемесячно или когда он становится слишком большим.
BLOCKQUOTE>
Если вы хотите очистить все файлы журналов, а не только те, которые находятся в папке журналов первого уровня, вы можете использовать:
shopt -s globstar # if needed
truncate -s 0 /var/log/*.log # first-level logs
truncate -s 0 /var/log/**/*.log # nested folders, like /var/log/nginx/access.log
Отметив, что если у вас уже есть [ 112] во время работы вам нужно будет также очистить повернутые журналы .gz
:
find /var/log -type f -name '*.[0-99].gz' -exec rm {} +
Допустимым использованием этого может быть, например, создание контейнера устройства виртуальной машины для распространения.
Вам не нужно делать это как часть обычного обслуживания: как правильно предположил D-E-M, используйте для этого logrotate
.
В ответ на @ D-E-N ответ
. Он найдет все файлы журналов в /var/log
и урежет их до 0 байтов.
find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
Существуют методы пары к полностью усечению файла, обычно применимого к самой совместимой POSIX ОС. Наиболее распространенный то, что Вы будете видеть со сценариями оболочки, является чем-то как true > file.txt
или : > file.txt
(и в случае bash
оболочка, >
одно только перенаправление достаточно). Это происходит из-за пути как >
открывает файлы через open()
или openat()
syscall с O_WRONLY|O_CREAT|O_TRUNC
флаги - который читает только для записи ИЛИ создает, если имя файла не существует, ИЛИ усекают существующее имя файла.
Имея это в виду, мы можем реализовать что-то как этот в C сами:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv){
if (argc == 2){
int fd = open(argv[1],O_TRUNC);
close(fd);
}
return 0;
}
Назовите файл, который хранит этот код как trunc.c
и скомпилируйте это с gcc trunc.c -o trunc
, и у Вас есть самостоятельно маленькая утилита, которая усечет аргумент имени файла, в котором как она обеспечивают trunc ./foobar.txt
. Конечно, этот код не делает других проверок, он только усекает сначала позиционный параметр. Я оставлю его до читателей, чтобы выяснить, как иметь дело больше чем с одним позиционным параметром. На ноте стороны, существует truncate()
syscall, который мы могли использовать также и усечь файл к переменной длине.
Теперь, если Вы не поклонник C, Python мог бы быть легче для Вас. open()
команда воздействует на тот же принцип в Python - вводный файл для записи и усечения, если имя файла существует. Таким образом мы можем сделать
python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy
Что касается нахождения всех .log
файлы, это уже было охвачено в других ответах - использование *
шарик или расширенный шарик в bash
. Существует также find -type f -name "*.log"
, который имеет -exec
флаг для выполнения команд (в данном случае sh -c ''
использовать в своих интересах >
потому что >
оператор оболочки и не внешний исполняемый файл). Таким образом можно сделать
find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;
Также стоит отметить что файлы журнала в каталоге такой как /var/log
часто поворачиваются на logrotate сервис, таким образом, будут имена файлов такой как /var/log/service.log
, /var/log/service.log.1
, и т.д., таким образом, можно хотеть использовать *.log.[1-9]
шаблон вместо этого
Среди прочего мы можем скопировать /dev/null
в желаемый файл. Достаточно странно, даже при том, что /dev/null
тип устройства специального символа файла, когда Вы копируете это в другом месте, результатом является пустой регулярный файл, по крайней мере, с GNU cp
. Таким образом мы можем сделать
cp /dev/null foo.txt
или
dd if=/dev/null of=foo.txt
Другое предложенное чтение:
Это - хорошая практика для вращения журналов в/var/logs для вращения с logrotate функциональностью, но не каждый раз, когда мы хотим сделать. Системные журналы будут распечатаны ее, и они будут удобны для отладки любых отказов.
, Если это - требование для не использования logrotate, затем опции могут быть исследованы. Хотя усеченный легкая опция в немногих разновидностях системы Unix, эта команда не доступна с готовностью, потребность, которая будет установлена. Если не позволенный установить новую команду затем ниже цикла может использоваться.
for logfile $(ls /path/*.log)
do
cat /dev/null > $logfile
done