Ответы:
попробуй это:
truncate -s 0 /var/log/*log
РЕДАКТИРОВАТЬ:
если вы хотите сделать это более одного раза, вы должны использовать logrotate
для обработки ваших журналов. Обычно он устанавливается в Ubuntu. Посмотрите man logrotate
(или, если у вас не установлено приложение, посмотрите онлайн-страницу руководства или установите его с помощью sudo apt-get install logrotate
)
с man-страницы:
logrotate предназначен для упрощения администрирования систем, которые генерируют большое количество файлов журналов. Это позволяет автоматически вращать, сжимать, удалять и отправлять файлы журналов по почте. Каждый файл журнала может обрабатываться ежедневно, еженедельно, ежемесячно или когда он становится слишком большим.
Если вы хотите очистить все файлы журналов, а не только те, которые находятся в папке журналов первого уровня, вы можете использовать:
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
Обратите внимание, что если у вас уже есть logrotate
запущенный, вам также необходимо очистить повернутые .gz
логи:
find /var/log -type f -name '*.[0-99].gz' -exec rm {} +
Допустимое использование для этого может быть, например, создание контейнера устройства VM для распространения.
Вам не нужно делать это как часть обычного обслуживания: как правильно предположил DEM, используйте logrotate
для этого.
Как следить за ответом @DEN
Это позволит найти все файлы журнала /var/log
и обрезать их до 0 байтов.
find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
*.log*
вместо этого, но я не уверен, что это на 100% безопасно, поэтому я не включил его в ответ. Потому что есть файлы, как dovecot.log-20180930
и dovecot.log-20180923.gz
.
Существует несколько методов полного усечения файла, обычно применимых к большинству POSIX-совместимых ОС. Чаще всего вы видите сценарии оболочки - это что-то вроде true > file.txt
или : > file.txt
(и в случае bash
оболочки >
достаточно только перенаправления). Это связано с тем, как >
файлы открываются с помощью open()
или openat()
системным вызовом с 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()
системный вызов, который мы также можем использовать и обрезать файл до переменной длины.
Теперь, если вы не фанат C, Python может быть проще для вас. open()
Команда работает по тому же принципу в Python - открытие файла для записи и усечения, если имя файла существует. Таким образом, мы можем сделать
python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy
Что касается поиска всех .log
файлов, это уже было рассмотрено в других ответах - используйте *
glob или extended glob 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
for logfile in /path/*.log
вместо этого.
/var/log
это то, где система помещает сообщения, которые вам могут понадобиться позже. Ubuntu сталкивался с проблемой раньше. Читатьman 8 logrotate;man logrotate.conf
.