2015-05-07 1 views
0

я сделал следующие действия на двух отдельных терминалов:Кто пишет в мой файл или почему Lsof не отображались писатель, но читатель делать

1s термин:

процесс Start, который при записи в файл в фоновом режиме:

└──> while true; do date >> log; sleep 1; done & 
[1] 20604 

Получить PID последнего процесса, который работает в фоновом режиме:

└──> echo $! 
20604 

второй термин:

Показать содержимое файла записывается:

└──> tail -f log 
Thu May 7 18:48:20 CEST 2015 
Thu May 7 18:48:21 CEST 2015 
Thu May 7 18:48:22 CEST 2015 
Thu May 7 18:48:23 CEST 2015 
Thu May 7 18:48:24 CEST 2015 
Thu May 7 18:48:25 CEST 2015 
Thu May 7 18:48:26 CEST 2015 
Thu May 7 18:48:27 CEST 2015 

первый термин:

Проверьте, кто получит доступ к файлу (обратите внимание, что только для чтения)

└──> lsof log 
COMMAND PID USER  FD TYPE DEVICE SIZE/OFF NODE NAME 
tail 21038 wakatana 3r REG 8,1  5340 797966 log 

Aft эр После killtail -f на второй терминал прекращается и lsof возвращается пустой выход:

└──> kill 21038 
└──> lsof log 
└──> 

второй срок:

Тогда я начал tail -f снова, и я увидел, что данные по-прежнему записываются в лог-файл. Это означает, что какой-то процесс все еще пишет в лог-файл:

└──> tail -f log 
Thu May 7 18:52:33 CEST 2015 
Thu May 7 18:52:34 CEST 2015 
Thu May 7 18:52:35 CEST 2015 
Thu May 7 18:52:36 CEST 2015 
Thu May 7 18:52:37 CEST 2015 
Thu May 7 18:52:38 CEST 2015 
Thu May 7 18:52:39 CEST 2015 
Thu May 7 18:52:40 CEST 2015 

В этом случае я действительно знаю, таинственное PID процесса, который пишет в файл, это PID 20604, так что я могу убить его и лог-файл остановится растет.

Мои вопросы:

  1. Почему не lsof дисплей (даже если выдается повторно) процесс, который на самом деле писать в лог-файл? Я понимаю, что 20604 относится к bash, и это не bash, который записывает файл напрямую, а является дочерним date. Но lsof не отобразил ни bash, ни date.
  2. Что делать, если я не знал PID 20604? Как я могу отслеживать процесс записи?

PS: Оболочка используется: GNU Баш, версия 4.2.37 (1) -release (x86_64-рс-Linux-гну)

ответ

2

У вас есть классическая проблема инженерной в виде асинхронной выборки здесь.

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

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

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

Если вы хотите версию этого вы можете сесть в акте, продолжают иметь поколение разнесенных во времени в скобках субоболочке, но сделать пишущего одну последовательную операцию:

(while true; do date ; sleep 1; done) > log & 

Или, если вы хотите попытаться поймать короткие события, вы можете посмотреть на механизм inotify (вы можете просмотреть его документацию с помощью man inotify). Имейте в виду, что нет никакой идентификации актера, и когда актер недолговечен, вы не можете затем пойти сделать lsof тип поиска, чтобы выяснить, кто это был.

+0

Благодарим за ответ Крис. Я пробовал также после 'ps -elf | grep -E 'log | date'', чтобы найти процесс, который записывает в файл, я полагаю, что это не работает по той же причине (планировщик ввода-вывода) как 'lsof'. Можете ли вы подтвердить или отклонить его? –

Смежные вопросы