Замініть файл жорстким посиланням на / 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.