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

31

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

Как я могу записать их в другой журнал?

Я подумал о замене файла log.txt жесткой ссылкой (приложение не может определить разницу, верно?) Или жесткой ссылкой, указывающей на / dev / null. Какие у меня варианты?

Малон
источник
Вы не можете просто chmod -w log.txt?
user168715 28.12.16

Ответы:

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

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

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

Джошуа
источник
4
Стоит отметить, что эта команда требует sudo(или работает от имени пользователя root). Пожалуйста, объясните (в своем ответе), что вы подразумеваете под "правильными номерами старших и младших разработчиков".
mklement0
3
(Я не OP.) Я ценю обновление, но я все еще не понимаю, как "старшие и младшие номера" относятся к пути к файлу /dev/null, как используется в вашей команде. И я думаю, что это поможет будущим читателям отметить в вашем ответе, что sudoтребуется.
mklement0
1
@wallyk: Спасибо, это действительно приятно знать. Но моя точка зрения такова: как вступить в игру в отношении cp -a /dev/null log.txtи мои комментарии?
mklement0
1
@MALON: На самом деле вы сделали, и на Ubuntu 14.04 вам действительно нужно , sudoчтобы выполнить эту команду, если не случится быть запущен как пользователь root(который , как правило , не рекомендуется). Использование sudo(или запуск от имени root) для создания жесткой ссылки (этот ответ) или символической ссылки (ответ @ V.Michel) может быть правильным решением в конце концов, если файл должен быть расположен в месте, в которое любая учетная запись пользователя может писать, но дело в том: обратите внимание на это требование явно.
mklement0
1
PS: я знаю, вижу, что основные, второстепенные комментарии, вероятно, относятся к комментарию по вопросу, рекомендующему использование mknod. Обратите внимание, что комментариям обычно уделяется мало внимания, поэтому кто-то читает только вопрос, а затем ваш ответ может быть сбит с толку (как и я; также обратите внимание, что большинство людей никогда не сталкиваются с такими понятиями, как основные и второстепенные номера устройств).
mklement0
64

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

ln -s /dev/null log.txt
В. Мишель
источник
Это также имеет то преимущество, что является самодокументированным, поскольку ls -l log.txtпоказывает, что это символическая ссылка на / dev / null, а не полагается на знание того, что, например, «1, 3» имеет какое-то значение.
Монти Хардер
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
larsks
источник
Но это работает только на системах, которые имеют привязку. (Например, современный Linux.)
reinierpost
В любом случае файл журнала не будет принадлежать файловой системе только для чтения.
Монти Хардер
1
Вы будете удивлены, как часто вы захотите записать один файл в файловой системе только для чтения. И это вполне может быть в nodevфайловой системе.
Жаворонки
6

Это критически зависит от того, КАК приложение обрабатывает log.txt.

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

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

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

plugwash
источник
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 .

user3824053
источник
Если catпроцесс завершается или происходит сбой, программа входа в систему будет зависать при заполнении канала.
Марко Марсала
1

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

rackandboneman
источник