Замініть файл жорстким посиланням на / dev / null


32

Я запускаю програму, яка пише в log.txt. Додаток було оновлено до нової версії, завдяки чому підтримувані плагіни більше не сумісні. Це змушує величезну кількість помилок у log.txt і, здається, не підтримує запис у інший файл журналу.

Як я можу записати їх до іншого журналу?

Я розглядав можливість заміни log.txt на жорстке посилання (додаток не може визначити різницю правильно?) Або жорстке посилання, яке вказує на / dev / null. Які мої варіанти?


Ви не можете просто chmod -w log.txt?
— користувач168715

Відповіді:


30
# cp -a /dev/null log.txt

Це копіює ваш нульовий пристрій з правильними основними та незначними номерами розробників, щоб у log.txtвас був іншийnull .

Пристрої взагалі не відомі по імені в ядрі, а за їх основною та незначною кількістю. Оскільки я не знаю, яку ОС у вас є, мені було зручно просто копіювати номери звідки ми вже знаємо, що вони є. Якщо ви робите це з неправильними основними та незначними номерами, ви, швидше за все, зробили б якийсь інший пристрій, можливо, диск або щось інше, на яке не хочете писати.


4
Варто зазначити, що ця команда вимагає sudo(або виконується як користувач root). Поясніть, будь ласка, (у своїй відповіді), що ви маєте на увазі під "правильними основними та мінорними номерами розробників".
— mklement0

3
(Я не ОП.) Я ціную оновлення, але я все ще плутаю те, як "основні та другорядні числа" стосуються шляху до файлу /dev/null, як використовується у вашій команді. І, я думаю , що це допоможе читачам в майбутньому на ноту в своїй відповіді , що sudoпотрібно.
— mklement0

1
@wallyk: Дякую, це дійсно добре знати. Але моя думка полягає в тому, як це грає стосовно cp -a /dev/null log.txtмоїх коментарів і моїх коментарів?
— mklement0

1
@MALON: На насправді ви зробили, і на Ubuntu 14.04 вам дійсно потрібно , sudoщоб виконати цю команду, якщо не трапиться бути запущений як користувач root(який , як правило , що не рекомендується). Використання sudo(або функціонування як root) для створення жорсткого посилання (ця відповідь) або символьного посилання (@ відповідь В.Міхеля) може бути правильним рішенням, якщо файл повинен бути розміщений у такому місці, до якого може записувати будь-який обліковий запис користувача, але справа в тому: робити це вимога прямо.
— mklement0

1
PS: Я знаю, бачу, що основні, незначні коментарі, ймовірно, стосуються коментаря до питання, що рекомендує використовувати mknod. Зауважте, що коментарі, як правило, приділяють мало уваги, тому хтось, читаючи лише запитання, а потім ваша відповідь може бути заплутаним (як це було я; також зауважте, що більшість людей ніколи не стикаються з такими поняттями, як основна та незначна кількість пристроїв).
— mklement0

65

Ви можете зробити символьне посилання на / dev / null, і вам не потрібно мати root:

ln -s /dev/null log.txt

Це також має перевагу бути самодокументованим, що ls -l log.txtсвідчить про те, що це символьне посилання на / dev / null, а не покладатися на знання того, що, наприклад, "1, 3" є якимось значущим.
— Monty Harder

14

Інші відповіді тут, ймовірно, спрацюють. Зокрема, рішення симлінк, ймовірно, буде найпростішим рішенням. Я пропоную це в основному для повноти.

Рішення, що викликають 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

Але це працює лише в системах, які мають кріплення для прив’язки. (
— Наприклад,

Файл журналу ні в якому разі не належатиме до файлової системи, доступної лише для читання.
— Monty Harder

1
Ви були б здивовані, як часто ви виявляєте, що хочете записати в один файл у файловій системі лише для читання. І це дуже може бути у nodevфайловій системі.
— larsks

6

Це критично залежить від того, як програма обробляє log.txt.

Якщо програма просто відкриває існуючий файл і записує в нього, то, як описано в інших відповідях, ви можете символізувати його до / dev / null, символізувати його десь в іншому місці, жорстке посилання деінде (хоча жорсткі посилання не можуть бути перехресною файловою системою, щоб не було ' t дуже важливо в цьому) створити там копію вузла / dev / null пристрою тощо.

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

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


chattr +i log.txtперший раз, і програма більше не видалить файл.
— Марко Марсала

3

Ну, один негідний метод із названою трубою:

# 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 .


Якщо catпроцес загине або вийде з ладу, програма входу буде зависла, коли труба заповнена.
— Марко Марсала

-1

Подумайте, як зробити файл фактичним нульовим пристроєм. Файл "log.txt", створений за допомогою mknod, з правильним типом файлу та однаковими мінорними та основними номерами, буде виконувати функції нульового пристрою, оскільки він є.


Це нічого не додає до того, що вже говорили інші.
— Kusalananda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.