я сделал следующие действия на двух отдельных терминалов:Кто пишет в мой файл или почему 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 эр После kill
tail -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, так что я могу убить его и лог-файл остановится растет.
Мои вопросы:
- Почему не
lsof
дисплей (даже если выдается повторно) процесс, который на самом деле писать в лог-файл? Я понимаю, что 20604 относится кbash
, и это не bash, который записывает файл напрямую, а является дочернимdate
. Ноlsof
не отобразил ниbash
, ниdate
. - Что делать, если я не знал PID 20604? Как я могу отслеживать процесс записи?
PS: Оболочка используется: GNU Баш, версия 4.2.37 (1) -release (x86_64-рс-Linux-гну)
Благодарим за ответ Крис. Я пробовал также после 'ps -elf | grep -E 'log | date'', чтобы найти процесс, который записывает в файл, я полагаю, что это не работает по той же причине (планировщик ввода-вывода) как 'lsof'. Можете ли вы подтвердить или отклонить его? –