Как увидеть какой файл пользователь редактирует в vi

Много хороших ответов, но позвольте мне добавить еще одну вещь ... Помните, что Unix - это многопроцессорный и многопользовательская система, поэтому потенциально многие пользователи будут пытаться выполнять файловые операции (особенно записи) в (почти) одно и то же время. Со старыми медленными жесткими дисками - возможно, установленными по сети - это не только потребует времени (на которое программы будут в основном зависать, а пользователям придется ждать), но и приведет к частому перемещению головки чтения / записи диск туда-сюда.

Вместо этого файлы, ожидающие записи, некоторое время хранились в памяти, а сортируются после того, как они должны оказаться на диске ...и когда буфер был заполнен - ​​или демон disk-sync ждал необходимое количество секунд (я думаю, обычно это было около 30 секунд) - весь буфер был записан на диск «по порядку», с записью голова должна делать только одно непрерывное движение, записывая файлы на диск по ходу ... вместо того, чтобы прыгать повсюду.

Конечно, с сегодняшними быстрыми дисками - не говоря уже о твердотельных устройствах - выигрыш намного меньше ... особенно в домашней Linux-системе, где одновременно работает только один пользователь, и только с несколько программ.

В любом случае, сочетание ожидания чтения путем чтения (в кэш / буфер) большего, чем требовалось, и сортировки данных, ожидающих записи, чтобы их можно было записать «одним движением», на самом деле было очень хорошим идея в то время, особенно в системах с большим количеством пользователей, читающих и пишущих.

3
08.02.2018, 22:23
6 ответов

¿quieres verlo desde dentro de vi o desde el caparazón? -de vim

<ESC>:ls list buffers opened 

Creo que vi no puede pero puedes usar ctrl+wwpara cambiar entre archivos

-del caparazón

lsof | grep -i  vi 
1
27.01.2020, 21:08

Esto podría funcionar en algunos casos. Puede usar pspara encontrar la identificación del proceso de la instancia vieditando el archivo:

$ w
...
username  pts/2    :0.0             11:42    2:34m  0.28s  0.27s vim foo

$ ps aux | grep 'vim foo'
...
username  55899.... vim foo

Luego, como root, mire los descriptores de archivos abiertos asociados con ese pid:

# ls -l /proc/55899/fd
...
lrwx------ 1 username group 64 Feb  8 14:23 6 -> /path/to/.foo.swp

Dado eso, entonces podría concluir que el archivo es /path/to/foo.

2
27.01.2020, 21:08

Necesitas usarlsof:

$ lsof  |grep -i vim
2
27.01.2020, 21:08

Puede usar lsofseleccionando el usuario y buscando el proceso vimcomo en:

sudo lsof -u user -a -c vim | grep swp

Como señala @Fox, el clásico vicrea un archivo temporal en /var/tmp, por lo que la alternativa para verlo, debe (no probarse ).

sudo lsof -u user -a -c vi | grep '/var/tmp/'

Sin embargo, como señala @Fox, no podrá correlacionarlo con el clásico vicon el archivo real, y luego necesitaría las herramientas de las que hablo a continuación en la respuesta (para clásico vi, para vimbastaría ellsof); por lo general hoy en día en Linux está usando vimal invocar vi.

Consulte 15 ejemplos de comandos lsof de Linux (Identificar archivos abiertos)

Volviendo al ejemplo vim, veremos que el archivo de intercambio que se usa con el nombre filese abre como en.file.swp

Si el usuario user1está haciendovi file:

$ sudo lsof -c vi -a -u user1 | grep swp
vi      3615  user1  3u   REG    8,1    12288 265061 /home/user1/.file.swp

deman lsof

-a causes list selection options to be ANDed

-cc This option selects the listing of files for processes executing the command that begins with the characters of c. Multiple commands may be specified, using multiple -c options. They are joined in a single ORed set before participating in AND option selection.

-u s This option selects the listing of files for the user whose login names or user ID numbers are in the comma-separated set s

Además de lsof, también puede usar como raíz, sysdig, que es un poderoso marco de depuración:

Esto mostrará todos los archivos abiertos en el sistema en tiempo real, enumerando el usuario, el pid y el proceso tan pronto como se abran:

sudo sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open"

sysdig: system-level exploration and troubleshooting tool

Sysdig instruments your physical and virtual machines at the OS level by installing into the Linux kernel and capturing system calls and other OS events. Then, using sysdig's command line interface, you can filter and decode these events in order to extract useful information and statistics.

Sysdig can be used to inspect live systems in real-time, or to generate trace files that can be analyzed at a later stage.

Como otra herramienta útil para administradores de sistemas, también puede instalar snoopy, que registra todas las invocaciones de procesos llamados a syslog. Si el usuario invoca en la línea de comando vi file, lo verá en los registros del sistema.

Tenga en cuenta que después de instalar snoopy,registrará todas las invocaciones de proceso a través de execve ()hasta que lo desinstale (, lo que puede querer o no que suceda todo el tiempo ).

snoopy: execve() wrapper and logger

snoopy is merely a shared library that is used as a wrapper to the execve() function provided by libc as to log every call to syslog (authpriv). system administrators may find snoopy useful in tasks such as light/heavy system monitoring, tracking other administrator's actions as well as getting a good 'feel' of what's going on in the system (for example Apache running cgi scripts).

Para instalar snoopyysysdig:

$sudo apt-get install snoopy sysdig

Consulte también la pregunta relacionada:Comprender lo que hace un binario de Linux

9
27.01.2020, 21:08

Si no tiene root pero tiene permisos para leer los directorios, su mejor opción probablemente sea buscar los archivos .swppara el archivo en cuestión (asumiendo que el usuario no ha cambiado el intercambio predeterminado de vim ¡ubicación!):

$ find. -type f
./1/foo
./0/foo
./2/foo

$ cd 1
$ vi foo
^Z 
[1] 19650

$ cd..
$ find -type f
./1/foo
./1/.foo.swp
./0/foo
./2/foo

Tenga en cuenta, sin embargo, que si edita fooy .fooen el mismo directorio, vimdeberá crear diferentes extensiones temporales de nombre de archivo:

-rw-r--r--   1 user grp  12288 Feb  8 14:59.foo.swo
-rw-------   1 user grp   4096 Feb  8 14:58.foo.swp

Por lo tanto, es posible que desee buscar usandofind. -user username -name '.*.sw*'

Esto se parece un poco a un problema XY--¿qué problema mayor estás tratando de resolver? Si está tratando de administrar varios usuarios que editan archivos comunes, es posible que desee pasar a un sistema de administración de fuentes.

0
27.01.2020, 21:08

Supongo que sabe qué comando ejecutó el usuario, pero desea saber desde qué directorio lo ejecutó (para que, si ejecutaron vi myfile.txt, sepa si es /home/user/myfile.txto /tmp/myfile.txt, o algo más ).

En ese caso, asumiendo que está ejecutando como root, puede hacer:

readlink /proc/<pid>/cwd

donde <pid>es el ID del proceso vi/ vimque le interesa -que le indicará el directorio actual de ese proceso, que tiene muchas posibilidades de ser el que usted desear.

Tenga en cuenta, sin embargo, que:

  • El usuario puede cambiar el directorio actual del proceso después de iniciar el editor (p. usando el comando :cd). También es posible que desee verificar el directorio actual del proceso de shell que generó el editor, aunque tampoco es 100% confiable.
  • El usuario puede abrir otros archivos, y eso no aparecerá en la línea de comando -por lo que puede estar editando otra cosa por completo.
0
27.01.2020, 21:08

Теги

Похожие вопросы