Linux проверить открыт ли файл

check if file is open with lsof

I’m using linux mint 13 xfce and I have a file named wv.gold that I’m trying to check in bash if it’s open by any program (for instance, I opened it in sublime-text and gedit ) In many forums people say that if I run lsof | grep filename I should get 0 if it’s open or 256(1) if it’s closed, but in fact I get nothing (empty string) if I run using grep «wv.gold» , and get a little list if I do it using grep gold . The list is something like:

bash 2045 user cwd DIR 8,1 4096 658031 /home/user/path/to/dir bash 2082 user cwd DIR 8,1 4096 658031 /home/user/path/to/dir watch 4463 user cwd DIR 8,1 4096 658031 /home/user/path/to/dir gedit 16679 user cwd DIR 8,1 4096 658031 /home/user/path/to/dir lsof 20823 user cwd DIR 8,1 4096 658031 /home/user/path/to/dir grep 20824 user cwd DIR 8,1 4096 658031 /home/user/path/to/dir lsof 20825 user cwd DIR 8,1 4096 658031 /home/user/path/to/dir 

Thus, I get the path to the directory it is but NOT the path to the file (there are other files there) and either way only to gedit process, not to sublime-text process. Is there some easy way to see if a txt file is opened by any other program? EDIT: It turns out (cf. comments from @mata and @ctn) that some editors load files and close them immediately, and they just reopen the file when saving it. This way, we can only see it when they are still opening a big file (since you have the time to observe it while opening) and it disappears immediately after that.

Источник

How to Check Open Files in Linux

You may have come across the saying, “Everything is a file in Linux.” Although this is not entirely true, it does hold a set of truths to it.

In Linux and Unix-like systems, everything is like a file. That means the resources in the Unix system get assigned a file descriptor, including storage devices, network sockets, processes, etc.

A file descriptor is a unique number that identifies a file and other input/output devices. It describes resources and how the kernel accesses them. Think of it as a gateway to the Kernel abstraction hardware resources.

Читайте также:  Linux local file include

Unfortunately, the concept of file descriptors is beyond the scope of this tutorial; consider the link provided below to get started on learning more:

That means that Unix and Unix-like systems such as Linux use such files heavily. As a Linux power user, seeing the open files and the process and users using them is incredibly useful.

This tutorial will focus on ways to view the files open and which process or user is responsible.

Pre-Requisites

Before we begin, ensure that you have:

If you have these, let us get started:

LSOF Utility

Created by Victor A Abell, List open files, or lsof for short, is a command-line utility that allows us to view the open files and the processes or users who opened them.

The lsof utility is available in major Linux distributions; however, you may find it not installed and thus may need to install manually.

How to Install lsof on Debian/Ubuntu

To install it on Debian, use the command:

sudo apt-get install lsof -y

How to Install on REHL/CentOS

To install on REHL and CentOS, use the command:

How to Install on Arch

On Arch, call the package manager using the command:

How to Install on Fedora

On Fedora, use the command:

Once you have the lsof utility installed and updated, we can begin using it.

Basic lsof Usage

To use the lsof tool, enter the command:

Once you execute the above command, lsof will dump a lot of information as shown below:

The above output shows all the files opened by the processes. The output has various columns, each representing specific information about the file.

  • The COMMAND column – shows the name of the process that is using the file.
  • PID – shows the Process Identifier of the process using the file.
  • The TID – Shows the task ID (threads) of the process.
  • TASKCMD – Represent the name of the task command.
  • USER – The owner of the process.
  • FD – Shows the file descriptor number. This is how processes use the file; the options available in this column output include:
  • cwd – current working directory.
  • mem – memory-mapped file
  • pd – parent directory
  • jld – jail directory
  • ltx – shared library text
  • rtd – root directory.
  • txt – program code and data
  • tr – kernel trace file.
  • err – File descriptor information error
  • mmp – Memory-mapped device.
  • TYPE – Shows the type of node associated with the file, such as:
  • Unix – for Unix domain socket.
  • DIR – represents the directory
  • REG – representing the regular file
  • CHR – represents the special character file.
  • LINK – symbolic link file
  • BLK – Block special file
  • INET – Internet domain socket
  • FIFO – a named pipe (First In First Out file)
  • PIPE – for pipes
  • DEVICES – Shows the device numbers separated by commas in the order of special character file, block special, regular, directory, and NFS file.
  • SIZE/OFF – shows the size of the file pr file offset in bytes.
  • NODE – shows the node number of the local file, type for internet protocol type, etc.
  • NAME – shows the name of the mount point and fs on which the file is located.
Читайте также:  Настройка линукс через прокси

Note: Please Refer to the lsof Manual for detailed information on the columns.

How to Show Processes that Opened a File

Lsof provides us with options that help us filter the output to show only the processes that opened a specific file.

For example, to see the file that opened the file /bin/bash, use the command as:

This will give you an output as shown below:

COMMAND PID USER FD TYPE DEVICE SIZE / OFF NODE NAME

ksmtuned 1025 root txt REG 253 , 0 1150704 428303 / usr / bin / bash

bash 2968 centos txt REG 253 , 0 1150704 428303 / usr / bin / bash

bash 3075 centos txt REG 253 , 0 1150704 428303 / usr / bin / bash

How Show files Opened by a Specific User

We can also filter the output to show the files opened by a specific user. We do this by using the -u flag followed by the username as:

This will give you an output as shown below:

How to Show Files Opened by a Specific Process

Suppose we want to view all the files opened by a specific process? For this, we can use the PID of the process to filter the output.

For example, the below command shows the files opened by bash.

This will give you only the files opened by systemd as shown:

How to Show Files Opened in a Directory

To get the files opened in a specific directory, we can pass the +D option followed by the directory path.

For example, list open files in the /etc directory.

Below is the output for this:

How to Show Network Connection

Since everything in Linux is a file, we can get the network files such as TCP files or connections.

This will give you the TCP connections in the system.

You can also filter by the specific port using the command shown below:

This will give you the output as shown below:

How to Continuously Show Files

Lsof provides us with a mode to loop the output every few seconds. This allows you to monitor the files opened by a process or user continuously.

This option, however, requires you to terminate the process manually.

For example, the command below continuously monitors the files opened on port 22:

As you can see, in the third loop, lsof catches the established connection to the server on SSH.

Conclusion

Lsof is an incredibly useful utility. It allows you to monitor for critical files as well as monitor users and processes opening files. This can be incredibly useful when troubleshooting or looking for malicious attempts to the system.

As shown in this tutorial, using various examples and methods, you can combine the functionality provided by the lsof tool for custom monitoring.

Thank you for reading and sharing! I hope you learned something new!

About the author

John Otieno

My name is John and am a fellow geek like you. I am passionate about all things computers from Hardware, Operating systems to Programming. My dream is to share my knowledge with the world and help out fellow geeks. Follow my content by subscribing to LinuxHint mailing list

Читайте также:  Посмотреть сколько всего оперативной памяти linux

Источник

как узнать открыт ли файл?

стоит такая задача — мониторить некую папку на предмет появления каких-то файлов и потом их обрабатывать .

и получается такая проблема . в эту папка файлы попадают по ФТП и. как узнать докачан ли файл уже или еще в процессе?

Re: как узнать открыт ли файл?

Re: как узнать открыт ли файл?

это я все и так знаю . как это в С/С++ программе реализовать ?

Re: как узнать открыт ли файл?

>некую папку на предмет появления каких-то файлов

не папку, а директорию. папки только на рабочем столе, это абстракция директорий для домохозяек.
см. /usr/src/linux/Documentation/dnotify.txt

Re: как узнать открыт ли файл?

именно с помощью dnotify это и мониторится . насчет «папки» — как хочу так и называю — мне так больше нравится

и вообще-то вопрос был совсем про другое

Re: как узнать открыт ли файл?

посмотри исходники или сделай strace

Re: как узнать открыт ли файл?

>и вообще-то вопрос был совсем про другое

Не совсем про другое. dnotify позволяет определить начало процесса без polling. Если хочешь определить окончание процесса, то придется бегать по /proc/pid/fd и смотреть не держит ли кто-то открытым этот файл.

Вообще, сама постановка задачи изначально не совсем корректная.

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

>насчет «папки» — как хочу так и называю — мне так больше нравится

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

Re: как узнать открыт ли файл?

В качестве альтернативы можно попробовать бегать не по /proc/pid/fd, а пробовать периодически устанавливать fcntl/F_SETLEASE F_WRLOCK, но на это нужны определенные привилегии и еще ряд нюансов.

Re: как узнать открыт ли файл?

Если даже файл не открыт, где гарантия что он закачан нормально? Как альтернатива — 1. Мониторить логи FTP сервера. 2. Внести изменения в код FTP сервера, чтобы он каким-то образом сообщал про upload вашей программе.

Re: как узнать открыт ли файл?

У меня похожий робот работает,
только я его делал на perl.

Я брал время последней модификации файла и если оно отличается от текущего меньше, чем на 20 cek ставил timewait 10 cek и повторял сие действие.

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

Похожие темы

  • Форум vsftpd на Debian 7 (2014)
  • Форум Битый tar (2003)
  • Форум freebsd 2.2.9-RELEASE.iso (2007)
  • Форум Синхронизация с FTP (2008)
  • Форум монтирование через PAM (изврат для ftp) (2007)
  • Форум FTPD (2002)
  • Форум Вопрос по пользователю . как настроить доступ по ftp в определенную папку (2009)
  • Форум помогите с фтп (2005)
  • Форум Как узнать имя директории расположенной на ftp сервере? (2013)
  • Форум Скрипт для фтп (2014)

Источник

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