Удалить дескриптор файла linux

Удаление открытого файла

Кто-нибудь может знает, возможно ли удалить файл, в который идёт поток информации, т.е. файл открыт на запись другим преложением, а мне в какой-то определённый момент времени нужно его обнулить в Unix/Linux. провобoвал echo > file echo -n > file head -c 0 > file cat /dev/null > file раземр не сбрасывается!

4 ответа 4

Если файл не залочен (обычно это не делается), то его можно легко удалить. Однако, исчезновение файла из дерева файлов не будет означать его фактическое удаление. На самом деле, файл будет существовать до тех пор, пока приложение, выполняющее в него запись, не закроет его. В то же время, файл будет уже нельзя открыть. В таком промежуточном состоянии он будте продолжать занимать место на диске. Я не уверен, что это поведение воспроизводится на всех файловых системах, но под ext3 я точно наблюдал подобное.

PS: таким образом, ответ на ваш вопрос: всё-таки это плохая идея и стоит воздержаться от этого. Тем более, что это точно будет непереносимо на другие платформы (такие как Windows).

lsof на вход принимает имя файла, а раз файл удалён, то и файла нет. Следовательно, lsof скажет, что файл не найден. Но на самом деле, тело файла всё ещё существует, хотя ссылок на него из дерева файлов уже нет.

cy6ergn0m@cgmachine ~ $ cat - > ~/delete & [1] 22129 cy6ergn0m@cgmachine ~ $ [1] + suspended (tty input) cat - > ~/delete cy6ergn0m@cgmachine ~ $ /usr/sbin/lsof ~/delete COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME cat 21808 cy6ergn0m 1w REG 8,7 0 19128453 /home/cy6ergn0m/delete cy6ergn0m@cgmachine ~ $ rm -f ~/delete cy6ergn0m@cgmachine ~ $ /usr/sbin/lsof ~/delete lsof: status error on /home/cy6ergn0m/delete: No such file or directory lsof 4.83 latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man usage: [-?abhlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]] [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s] [+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names] Use the ``-h'' option to get more help information. 

Источник

22.3.7. Закрытие файловых дескрипторов

В системах Linux и Unix файловые дескрипторы, как правило, наследуются через системные вызовы exec() (и всегда наследуются через fork() и vfork()). В большинстве случаев такое поведение нежелательно, поскольку только разделяться должны только stdin, stdout и stderr. Программы, запускаемые привилегированным процессом, не должны иметь доступа к файлам через унаследованный файловый дескриптор. Поэтому очень важно, чтобы программы внимательно закрывали все файловые дескрипторы, к которым не должна получить доступ новая программа. Это может стать проблемой, если ваша программа вызывает библиотечные функции, которые открывают файлы и не закрывают их. Одним из методов закрытия файловых дескрипторов является закрытие всех файловых дескрипторов вслепую из дескриптора номер 3 (тот, который следует сразу за stderr) произвольным большим значением (скажем, 100 или 1024)[165]. В большинстве программ это обеспечивает закрытие всех надлежащих файловых дескрипторов[166].

Читайте также:  Linux укажите тип файловой системы

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

Читайте также

9.1.1.2. Разделение дескрипторов файлов

9.1.1.2. Разделение дескрипторов файлов Атрибуты, которые порожденный процесс наследует от родителя, устанавливаются в те же значения, которые были в родительском процессе в момент выполнения fork(). Однако, с этого момента два процесса продолжают идти собственными путями

9.1.1.3. Разделение дескрипторов файлов и close()

9.1.1.3. Разделение дескрипторов файлов и close() Тот факт, что несколько дескрипторов файлов могут указывать на один и тот же открытый файл, имеет важное следствие: файл не закрывается до тех пор, пока не будут закрыты все дескрипторы файла.Позже в главе мы увидим, что несколько

Счетчики дескрипторов процессов

Счетчики дескрипторов процессов Распространенной ошибкой программистов является пренебрежение закрытием дескрипторов после того, как необходимость в них отпала; это может стать причиной утечки ресурсов, что, в свою очередь, может приводить к снижению

Дублирование дескрипторов

Дублирование дескрипторов Родительскому и дочернему процессам может требоваться различный доступ к объекту, идентифицируемому дескриптором, который наследует дочерний процесс. Кроме того, процессу вместо псевдодескриптора, получаемого с помощью функции GetModuleFileName или

Чтение и изменение дескрипторов безопасности

Чтение и изменение дескрипторов безопасности После того как дескриптор безопасности связан с файлом, следующим шагом является определение кода защиты существующего файла и его возможное изменение. Для получения и установления кода защиты файла в терминах дескрипторов

11.5.3. Дублирование файловых дескрипторов

11.5.3. Дублирование файловых дескрипторов Иногда процессам требуется создать новый файловый дескриптор, который ссылается на ранее открытый файл. Командные оболочки используют эту функциональность для перенаправления стандартного ввода, вывода и потока ошибок по

Читайте также:  Подключенные устройства компьютера linux

14.5. Универсализация файловых имен

14.5. Универсализация файловых имен Большинство пользователей Linux принимают как должное то, что запуск ls *.с не сообщает сведения о файле в текущем каталоге, именем которого является *.с. Вместо этого они ожидают увидеть список всех файлов в текущем каталоге, имена которых

Максимальное число дескрипторов для функции select

Максимальное число дескрипторов для функции select Ранее мы сказали, что большинство приложений не используют много дескрипторов. Например, редко можно найти приложение, использующее сотни дескрипторов. Но такие приложения существуют, и часто они используют функцию select

15.7. Передача дескрипторов

15.7. Передача дескрипторов Когда нам требуется передать дескриптор от одного процесса другому, обычно мы выбираем одно из двух решений:1. Дочерний процесс использует все открытые дескрипторы совместно с родительским процессом после вызова функции fork.2. Все дескрипторы

7.8.4. Параметры файловых систем

7.8.4. Параметры файловых систем В каталоге /proc/sys/fs/ можно найти файлы, определяющие работу файловой системы:• file-max — максимальное число одновременно открытых файлов, по умолчанию 4096.• inode-max — максимальное число одновременно открытых инодов, по умолчанию 4096.• super-max —

15.8. Передача дескрипторов

15.8. Передача дескрипторов Когда мы говорим о передаче открытого дескриптора от одного процесса другому, обычно подразумевается одно из двух:? наследование всех открытых дескрипторов родительского процесса дочерним после вызова fork;? сохранение открытых дескрипторов при

Правило 28: Избегайте возвращения «дескрипторов» внутренних данных

Правило 28: Избегайте возвращения «дескрипторов» внутренних данных Представим, что вы работаете над приложением, имеющим дело с прямоугольниками. Каждый прямоугольник может быть представлен своим левым верхним углом и правым нижним. Чтобы объект Rectangle оставался

9.6.2.2. Переопределение дескрипторов (handle)

9.6.2.2. Переопределение дескрипторов (handle) Когда программа начинает выполняться, пять дескрипторов (handle), соответствующих стандартным вводу, выводу, выводу сообщений об ошибках, порту и устройству печати, уже назначены. Пользователь может использовать значения этих

Создание файловых систем

Создание файловых систем Пулы хранения представляют собой вместилища для наборов данных, для манипуляции которыми предназначена вторая из главнейших команд – zfs. Самыми важными наборами данных являются файловые системы, к рассмотрению которых мы и переходим.Для

Источник

How to close file descriptor via Linux shell command

In /proc/pid/fd/ , there are too many file descriptors. Can I use shell command to close these file descriptors?

I had a case where some commercial app opened the same file with more than 1000 file descriptors, then ran out of file descriptors. The application was even unable to terminate though its own commands, so I had to kill it. If I were able to close some of the file descriptors, the program might have been able to terminate more cleanly.

Читайте также:  Malware on linux systems

5 Answers 5

You can definitely close fd’s of other running processes as long as you have the permissions to do so.

Then, start gdb and attach to the process:

Then, call the close system call on the fd you want to close:

If the file descriptor was a leaked one, then the program will never try to use it again anyway, and it shouldn’t cause any issues. The program most likely has a bug, however.

You can close a FD n of the current process in bash as so:

Thanks. But it is used to close FD of the current process (bash process). Do you know any method to close FD of specific process?

@Thomas answer is valid only when debug information for close() call is installed.

Without debug info installed, gdb refuses to call close() :

(gdb) call close(3) 'close' has unknown return type; cast the call to its declared return type 

The simplest way to make gdb call close() in this case is to cast the call to close() return type:

Sometimes, a function you wish to call is missing debug information. In such case, GDB does not know the type of the function, including the types of the function’s parameters. To avoid calling the inferior function incorrectly, which could result in the called function functioning erroneously and even crash, GDB refuses to call the function unless you tell it the type of the function.

For prototyped (i.e. ANSI/ISO style) functions, there are two ways to do that. The simplest is to cast the call to the function’s declared return type.

Probably due to aggressive modern symbol table stripping: close() being a system call, it should be known to any process that uses the shared C library.

I’ve ran in a similar situation, but where gdb was not an option since it disrupted the real-time constraints of my application and distorted my test.

So I came up with a quick iptables rule. Optional arguments put into square brackets ( [ opt ] ).

    Find your destination address and port: netstat —program [ —numeric-host —numeric-ports ] | grep []/[]

$ netstat --program --numeric-ports | grep 8812/ tcp 0 0 ysc.xxx:54055 10.56.1.152:30000 ESTABLISHED 8812/my-application tcp 0 0 ysc.xxx:46786 postgres.xxx:5432 ESTABLISHED 8812/my-application tcp 0 0 ysc.xxx:36090 10.56.4.79:57000 ESTABLISHED 8812/my-application . unix 2 [ ] DGRAM 7177020 8812/my-application 
$ iptables -A OUTPUT --destination 10.56.4.79 --dport 57000 --jump DROP $ 
$ netstat --program --numeric-ports | grep 8812/ tcp 0 0 ysc.xxx:54055 10.56.1.152:30000 ESTABLISHED 8812/my-application tcp 0 0 ysc.xxx:46786 postgres.xxx:5432 ESTABLISHED 8812/my-application . unix 2 [ ] DGRAM 7177020 8812/my-application 
$ iptables -D OUTPUT --destination 10.56.4.79 --dport 57000 --jump DROP $ 

Источник

Оцените статью
Adblock
detector