Заменить файл жесткой ссылкой на / dev / null

Вам нужно сохранить все строки в массиве, чтобы иметь возможность снова пройти по ним в END {} . Или, как вариант, дважды просканируйте файл. Итак, сохраняем все значения и строки:

awk 'NR == 1 {header=$0; next}            # save the header            
  { lines[NR]  = $0; values[NR] = $2;     # save the line and 2nd field
    if ($2 > max) max = $2; }             # update max

  END { print header;                     # in the end, print the header
        for (i = 1 ; i <= NR ; i++)  {    # (we skipped line 0)
          if (values[i] >= max * 0.2)     # print lines where $2 was high enough
            print lines[i]; } } ' file_in 
32
23.12.2016, 01:04
7 ответов
# cp -a /dev/null log.txt

Это копирует ваше нулевое устройство с правильными старшими и младшими номерами разработчиков в log.txt , поэтому у вас есть еще один null .

Устройства в ядре известны не по именам, а по старшим и младшим номерам. Так как я не знаю, какая у вас ОС, мне было удобно просто скопировать числа с того места, где мы их уже знаем. Если вы сделаете это с неправильными старшим и младшим номерами, вы, скорее всего, сделали бы какое-то другое устройство, возможно, диск или что-то еще, на которое вы не хотите писать.

32
27.01.2020, 19:37

Это в решающей степени зависит от того, КАК приложение обрабатывает файл log.txt.

Если приложение просто открывает существующий файл и записывает в него, то, как описано в других ответах, вы можете символически связать его с / dev / null, связать его в другом месте, жестко связать его где-то еще (хотя жесткие ссылки не могут быть перекрестными файловыми системами, поэтому в этом нет особого смысла) создайте там копию узла устройства / dev / null и т. д.

OTOH, если приложение удаляет и воссоздает log.txt, ничего из этого не сработает. Вы можете создать символическую ссылку на весь каталог в другом месте, чтобы перенаправить записи в другую файловую систему, но это все, и вам придется иметь дело с другими вещами в каталоге.

Думаю, если вы действительно хотите, вы могли бы создать настраиваемую файловую систему наложения, которая пропускала бы большинство операций, отбрасывая любые попытки создать файл с именем log.txt.

6
27.01.2020, 19:37

Вы можете создать символическую ссылку на / dev / null, и вам не нужно быть пользователем root:

ln -s /dev/null log.txt
68
27.01.2020, 19:37

Ну, один неудачный метод с именованным каналом :

# create a named pipe
mkfifo /path/to/log.txt
# read contents from the pipe and redirect them to /dev/null
cat /path/to/log.txt > /dev/null

вы почти может делать что угодно с выгруженным журналом, например фильтровать или отправлять через nc .

3
27.01.2020, 19:37

Другие ответы здесь, вероятно, будут работать. В частности, решение с символической ссылкой, вероятно, будет самым простым решением. Предлагаю это в основном для полноты картины.

Решения с использованием mknod (или cp -a ) становятся проблематичными, если файловая система, содержащая файл, не поддерживает устройства (например, она была смонтирована с nodev вариант, например). И, конечно же, жесткие ссылки между файловыми системами просто не будут работать.

Альтернативой жестким ссылкам или созданию новых узлов устройств является использование привязок монтирования, которые позволяют монтировать файл или каталог из одной части дерева файловой системы в другую. Так, например, вы можете запустить:

mount -o bind /dev/null /path/to/log.txt

Это во многом похоже на жесткую ссылку, но:

  • Он может работать с файловыми системами (потому что он не основан на индексах файловой системы, как жесткая ссылка)
  • Он работает с файловые системы только для чтения (потому что вы фактически не изменяете файловую систему)

Полный пример:

bash-4.3# ls -l /var/log/boot.log
-rw-r--r--. 1 root root 7436 Dec 19 10:00 /var/log/boot.log
bash-4.3# mount -o bind /dev/null /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
bash-4.3# echo words words words > /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
14
27.01.2020, 19:37

Подумайте о том, чтобы сделать файл настоящим нулевым устройством. Файл "log.txt", созданный с помощью mknod, с правильным типом файла и теми же младшими и старшими номерами, будет действовать как нулевое устройство, потому что так оно и есть.

-2
27.01.2020, 19:37

chattr +i log.txtв первый раз, и приложение больше не будет удалять файл.

0
02.01.2021, 23:39

Теги

Похожие вопросы