Назад | Перейти на главную страницу

Как я могу создать журнал для существующего демона?

У меня работает демон (который я не создавал), и мне нужно читать его журналы. К сожалению, у него нет файла журнала. Есть ли способ передать вывод демона в файл и постоянно обновлять его, чтобы я мог запустить на нем tail -f?

Файлы под /proc/<PID>/fd/<FD> являются символическими ссылками на соответствующие им файловые объекты. Итак, если программа с PID 45920 читает из файла по адресу /home/hypnotoad/all_glory_to_the_hypnotoad, и этот файл сопоставляется с файловым дескриптором 3, затем бег ls -l /proc/45920/fd/3 даст:

lrwx------. 1 root root 64 Mar 15 18:33 /proc/45920/fd/3 -> /home/hypnotoad/all_glory_to_the_hypnotoad

Итак, если у вас есть PID процесса демона, вы можете увидеть, какие файловые дескрипторы он открыл (и какие файлы эти дескрипторы сопоставляют), используя ls -l /proc/<PID>/fd/ и вы можете узнать немного больше об этих дескрипторах, используя find /proc/<PID>/fdinfo/ | xargs -n 1 cat.

Конечно, у него будут файловые дескрипторы. 0 (стандартный ввод), 1 (stdout) и 2 (stderr) открытый, и он может иметь дескриптор файла 255 открытый (для tty). Если fdinfo указывает pos значение, отличное от нуля, это означает, что дескриптор файла почти наверняка используется (потому что он дает позицию указателя в файле / потоке / что-есть-у вас).

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

Также стоит отметить попутно, что процесс, который вы используете для запуска gdb будут применяться обычные ограничения, связанные с ptrace системный вызов, поэтому вы захотите убедиться, что ваш процесс либо запущен как root, либо запущен в каком-либо другом контексте, чтобы он мог подключаться к демону.

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