Зачастую пользователям и системным администратором необходимо отслеживать, к каким файлам обращается приложение. В Linux-е уже есть все средства для этого, и тем удивительнее постоянно слышать на форумах — есть ли аналог Sysinternal Filemon. В данной статье я опишу использование утилиты strace, и рассмотрю ряд моментов, которые ускользают от некоторых пользователей, полагающих, что приложениям надо ограничивать права даже на чтение, например, ограничить доступ mplayer-а только к показываемому фильму.
strace — это трассировщик системных вызовов и сигналов. Для работы с файлами используется системный вызов «open», и соответственно, необходимо отслеживать только его. Пример команды:
$ strace -xf -eopen -o /path/to/log /path/to/program
Здесь мы указываем отслеживать все дочерние процессы, заменять непечатаемые символы на шестнадцатеричное представление и сохранять лог вызовов в файл /path/to/log. Потом полученный лог можно обработать соответствующими инструментами. Далее будут приведены примеры, как можно вычленить из лога всю нужную информацию.
Права доступа к файлам конфигурации и баз данных на Linux
Мониторинг текстового редактора nano
- Конфигурация nano (nanorc, ~/.nano_history)
- Динамические библиотеки, используемые программой (libc и др.)
- Файлы локализации
- И собственно редактируемый файл
Мониторинг видеопроигрывателя mplayer
Теперь попробуем запустить mplayer и проверить те файлы, в которые он только пишет. Возможно, это нам даст возможность составить нужный безопасный профиль работы программы.
$ strace -xf -eopen -o out.log mplayer test.mp4
$ sed -n ‘s/.*open((.*))s*=.*/1/p’ out.log | grep -v O_RDONLY | sort
«/dev/3dfx», O_RDWR
«/dev/fb0», O_RDWR
«/dev/mga_vid», O_RDWR
«/dev/mga_vid», O_RDWR
«/dev/shm/pulse-shm-3056117003», O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW|O_CLOEXEC, 0400
«/home/nuald/.mplayer/config», O_WRONLY|O_CREAT|O_EXCL, 0666
«/home/nuald/.pulse-cookie», O_RDWR|O_CREAT|O_NOCTTY, 0600
Здесь мы командой grep ограничили вывод, и не включали файлы, которые были открыты с флагом O_RDONLY (только на чтение). Как видите, и здесь не все так гладко — mplayer-у приходится писать в другие файлы, и возможно ограничение доступа полностью его сломает, и он не сможет воспроизводить видео. Так что приведенную выше идею об ограничении доступа не так просто будет реализовать, и точно не реализовать в ее изначальном смысле.
Заключение
В этом небольшом эскурсе была приведена лишь одна область применения strace. У данной программы есть много замечательных способностей, и она может позволить избавиться от бессонных ночей в поисках причин неработоспобности приложений даже без применения отладчика. Это инструмент, который должен знать любой Linux-разработчик, и надеюсь, что это принесет вам пользу в борьбе с многочисленными багами, и повысить качество разрабатываемого программного обеспечения.
LPIC 104.5 часть вторая: права доступа к файлам и папкам
- SystemTap — инструментарий для сбора статистики. Острожно — требует debug-версии ядра (из него он берет отладочные символы и информацию). Пример мониторинга операции «open» описан в документации.
- /proc/sys/vm/block_dump — Отладка блокового ввода-вывода.
- inotify -подсистема ядра Linux, которая позволяет получать уведомления об изменениях в файловой системе. Можно использовать через inotify tools.
Источник: habr.com
Как пользоваться командой strace в Linux
Операционная система Линукс время от времени подкидывает самые разнообразные проблемы. Порой причины выявить крайне тяжело, даже вооружившись анализом логов об ошибках. Но и эта ситуация имеет свой выход, потому что есть специальные средства. Любая программа и ее функционирование может быть отслежено с помощью системных вызовов специализированной программы.
Благодаря системным вызовам можно узнать какие файлы использует приложение, сетевой порт, а также что именно ей необходимо для функционирования. Здесь же можно будет найти ошибки, которые возникают у программы. То есть это действительно хороший способ понять, как работает программа и в какой момент возникает ошибка. Все эти преимущества дарит команда Strace в операционной системе Linux. Стоит разобраться, как правильно использовать данную команду и каким образом она работает.
Что такое strace
strace – программа, использующая подсистему ядра ptrace для отслеживания
системных вызовов. Основной недостаток strace – замедление работы приложений, в десятки или даже сотни раз, поэтому в production среде применяйте аккуратно. Утилита поможет продемонстрировать все вызовы программы, а также узнать, что конкретно используется во время выполнения поставленных задач. Если появляется необходимость, то можно без лишних проблем произвести подключение к запрещенным процессам. Перед непосредственной практикой, необходимо разобраться в ее рациональности утилиты и состав:
strace опции команда аргументы
- -i — позволяет вывести указатели на инструкция пока производится системный вызов.
- -k — позволяет вывести стек вызова для того, чтобы отслеживать процессы всех системных вызовов.
- -o — позволяет вывести все информационные данные о системном вызове не в классический поток проблем, а в отдельные файлы.
- -q — отключает вывод сообщений о подключении и отключении.
- -qq — позволяет запретить вывод сообщений о том, что процесс завершился.
- -r — выводит временные метры для каждого вызова системы.
- -s — указывает максимальные размеры выводимых строк. По стандарту установлено значение 32.
- -t — выводит время суток всех вызовов.
- -tt — добавляет микросекунду к каждому процессу.
- -T — выводит информацию о длительности системных вызовов.
- -x — выводит каждую строку в шестнадцатеричной системе.
- -xx — выводит частично строки в шестнадцатеричной системе.
- -y — позволяет вывести путь файлового дескриптора.
- -yy — выводит информацию о протоколах файловых дескрипторов.
- -c — ведет счет ошибок, вызовов и время на выполнение всех системных вызовов.
- -O — добавляет определенное количество микросекунд к счетчикам каждого системного вызова.
- -S — сортирует информационные блоки, которые выводятся с помощью параметра -c.
- -w — суммирует время между активацией и завершения системных вызовов.
- -e — позволит фильтровать определенные системные вызовы, а также события.
- -P — отслеживает исключительно системные вызовы, которые относятся к указанному пути.
- -v — позволит вывести дополнительные блоки информации.
- -b — указывается системный вызов обнаружения, после этого трассировка заканчивается.
- -f — отслеживает прочие процессы, если они были созданы.
- -ff — если задается параметр -o, то для всех дочерних процессов создаются отдельные файлы.
- -l — позволит заблокировать реакции после нажатия комбинации горячих клавиш Ctrl+C и Ctrl+Z.
- -E — добавит переменную окружению для запуска программы.
- -p — указывает pid процессов, которые используются для подключения.
- -u — запускает программу от определенного пользователя.
Это самые основные опции процесса strace. Однако для полного использования, необходимо еще дополнительно понять функционирование системных вызовов. Не стоит рассматривать абсолютно все параметры, будет достаточно основных. Вот на что необходимо обратить свое внимание:
- fork — создает дополнительные процессы.
- read — совершить попытку прочитать информацию из файловых дескрипторов.
- write — совершить попытку запись файловый дескриптор.
- open — откроет файлы для того, чтобы читать или записывать файлы.
- close — закрывает файлы после того, как будет проведено чтение и запись.
- chdir — меняет актуальную директорию.
- execve — выполняет исполняемый файл.
- stat — получить подробную информацию о файлах.
- mknod — создаются специальные файлы. Сюда можно отнести файлы устройства или сокета.
Теперь необходимо разобраться в самих примерах.
Как использовать Strace: примеры
Запуск программу
Самый лучший вариант запуска программы — это использовать параметры и имя команда. Сюда можно можно отнести исполняемые файлы утилиты, которую необходимо будет рассматривать. Например:
После этого откроется полный список, состоящий из системных вызовов, созданный самой утилитой. Чтобы узнать актуальную версию ядра, необходимо использовать следующий параметр:
имя_системного_вызова (параметр1, параметр2) = результат сообщение
Имя системных вызовов означает, что именно будет вызывать утилита. Для подавляющего большинства вызовов свойственна передача параметров, имен файлов, данных и прочая информация. Все эти аспекты необходимо заключить в круглые скобки. Теперь необходимо разобраться в значе равно, а также результате выполнения.
Если все прошло так, как необходимо, то после равенства будет располагаться значение ноль или любое другое положительные числовое значение. Если появляется отрицательное значение, то это говорит исключительно о возникновении ошибок. Как правило, все это сопровождается сообщение.
К примеру, можно увидеть следующее сообщение об ошибке:
openat(AT_FDCWD, «/usr/local/cuda-6.5/lib64/tls/x86_64/libc.so.6», O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
Именно здесь можно увидеть значение -1 после равенства. Также сообщение говорит о том, что некие файлы не обнаружены. Однако на функционировании программы это совершенно не отражается. Эта программа будет заключаться только на сторонних библиотеках. Основное функционирование утилиты будет выполняться строкой:
Здесь уже полный порядок, ведь ядро возвращено и после равенства установлено нулевое значение.
Выводы
Можно сделать вывод, что это действительно очень удобная утилита для работы. Она позволит решить подавляющее большинство разнообразных проблем и ошибок в системе или сервере. В материале рассмотрены основные инструменты и другие аспекты, позволяющие начать комфортное использование данной программы. Этого небольшого минимума будет вполне достаточно.
Источник: www.vseprolinux.ru
strace — отслеживаем выполнение процесса
Thank you for reading this post, don’t forget to subscribe!
strace — утилита для Linux, которая позволяет отследить выполнение системных вызоWow ( system call ) и сигналов к ядру системы
КОМАНДА STRACE LINUX
Как я уже сказал, команда strace показывает все системные вызовы программы, которые та отправляет к системе во время выполнения, а также их параметры и результат выполнения. Но при необходимости можно подключиться и к уже запущенному процессу. Перед тем, как перейти к практике, разберём опции утилиты и её синтаксис:
$ strace опции команда аргументы
В самом простом варианте strace запускает переданную команду с её аргументами и выводит в стандартный поток ошибок все системные вызовы команды. Давайте разберём опции утилиты, с помощью которых можно управлять её поведением:
- -i — выводить указатель на инструкцию во время выполнения системного вызова;
- -k — выводить стек вызоWow для отслеживаемого процесса после каждого системного вызова;
- -o — выводить всю информацию о системных вызовах не в стандартный поток ошибок, а в файл;
- -q — не выводить сообщения о подключении о отключении от процесса;
- -qq — не выводить сообщения о завершении работы процесса;
- -r — выводить временную метку для каждого системного вызова;
- -s — указать максимальный размер выводимой строки, по умолчанию 32;
- -t — выводить время суток для каждого вызова;
- -tt — добавить микросекунды;
- -ttt — добавить микросекунды и количество секунд после начала эпохи Unix;
- -T — выводить длительность выполнения системного вызова;
- -x — выводить все не ASCI-строки в шестнадцатеричном виде;
- -xx — выводить все строки в шестнадцатеричном виде;
- -y — выводить пути для файловых дескрипторов;
- -yy — выводить информацию о протоколе для файловых дескрипторов;
- -c — подсчитывать количество ошибок, вызоWow и время выполнения для каждого системного вызова;
- -O — добавить определённое количество микросекунд к счетчику времени для каждого вызова;
- -S — сортировать информацию выводимую при опции -c. Доступны поля time, calls, name и nothing. По умолчанию используется time;
- -w — суммировать время между началом и завершением системного вызова;
- -e — позволяет отфильтровать только нужные системные вызовы или события;
- -P — отслеживать только системные вызовы, которые касаются указанного пути;
- -v — позволяет выводить дополнительную информацию, такую как версии окружения, статистику и так далее;
- -b — если указанный системный вызов обнаружен, трассировка прекращается;
- -f — отслеживать также дочерние процессы, если они будут созданы;
- -ff — если задана опция -o, то для каждого дочернего процесса будет создан отдельный файл с именем имя_файла.pid.
- -I — позволяет блокировать реакцию на нажатия Ctrl+C и Ctrl+Z;
- -E — добавляет переменную окружения для запускаемой программы;
- -p — указывает pid процесса, к которому следует подключиться;
- -u — запустить программу, от имени указанного пользователя.
Вы знаете основные опции strace, но чтобы полноценно ею пользоваться, нужно ещё разобраться с системными вызовами, которые используются чаще всего. Мы не будем рассматривать все, а только основные. Многие из них вы уже и так знаете, потому что они называются так же, как и команды в терминале:
- fork — создание нового дочернего процесса;
- read — попытка читать из файлового дескриптора;
- write — попытка записи в файловый дескриптор;
- open — открыть файл для чтения или записи;
- close — закрыть файл после чтения или записи;
- chdir — изменить текущую директорию;
- execve — выполнить исполняемый файл;
- stat — получить информацию о файле;
- mknod — создать специальный файл, например, файл устройства или сокет;
А теперь разберём примеры strace Linux.
ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ STRACE
1. ЗАПУСК ПРОГРАММЫ
Самый простой способ запуска утилиты — просто передать ей в параметрах имя команды или исполняемый файл программы, которую мы хотим исследовать. Например, uname:
Как и ожидалось, мы видим список системных вызоWow, которые делает утилита, чтобы узнать версию ядра. Синтаксис вывода такой:
имя_системного_вызова (параметр1, параметр2) = результат сообщение
Имя системного вызова указывает, какой именно вызов использовала программа. Для большинства вызоWow характерно то, что им нужно передавать параметры, имена файлов, данные и так далее. Эти параметры передаются в скобках. Далее идет знак равенства и результат выполнения. Если всё прошло успешно, то здесь будет ноль или положительное число.
Если же возвращается отрицательное значение, делаем вывод, что произошла ошибка. В таком случае выводится сообщение.
Например, в нашем выводе есть сообщения об ошибке:
openat(AT_FDCWD, «/usr/local/cuda-6.5/lib64/tls/x86_64/libc.so.6», O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
Здесь результат выполнения -1 и сообщение говорит, что файл не найден. Но на работу программы это не влияет. Это проблема подключения сторонних библиотек и к этой утилите она не имеет отношения. А основная работа программы выполняется строчкой:
И здесь ядро вернуло положительный результат.
2. ПОДКЛЮЧЕНИЕ К ЗАПУЩЕННОЙ ПРОГРАММЕ
Если программа, которую нам надо отследить, уже запущена, то не обязательно её перезапускать с нашей утилитой. Можно подключиться к ней по ее идентификатору PID . Для тестирования этой возможности запустим утилиту dd, которая будет записывать нули из /dev/zero в файл file1:
dd if=/dev/zero of=~/file1
Теперь узнаем PID нашего процесса, поскольку он такой один, можно воспользоваться pidof, вы же можете использовать ps:
И осталось подключиться к нашему процессу:
sudo strace -p 31796
В выводе утилиты мы видим, что она читает данные из одного места с помощью вызова read и записывает в другое через write. Чтобы отсоединится от процесса, достаточно нажать Ctrl+C. Дальше рассмотрим примеры strace Linux для фильтрации данных.
3. ФИЛЬТРАЦИЯ СИСТЕМНЫХ ВЫЗОВОВ
Утилита выводит слишком много данных, и, зачастую, большинство из них нас не интересуют. С помощью опции -e можно применять различные фильтры для более удобного поиска проблемы. Мы можем отобразить только вызовы stat, передав в опцию -e такой параметр trace=stat:
sudo strace -e trace=stat nautilus
Кроме непосредственно системных вызоWow, в качестве параметра для trace можно передавать и такие значения:
- file — все системные вызовы, которые касаются файлов;
- process — управление процессами;
- network — сетевые системные вызовы;
- signal — системные вызовы, что касаются сигналов;
- ipc — системные вызовы IPC ;
- desc — управление дескрипторами файлов;
- memory — работа с памятью программы.
4. ВОЗВРАЩЕНИЕ ОШИБКИ
Можно попросить strace вернуть программе ошибку по нужному системному вызову -e, но с параметром fault. Синтаксис конструкции такой:
fault=имя_вызова:error=тип_ошибки:when=количество
С именем вызова всё понятно, тип ошибки, номер ошибки, которую надо вернуть. А с количеством всё немного сложнее. Есть три варианта:
- цифра — вернуть ошибку только после указанного количества запросов;
- цифра+ — вернуть ошибку после указанного количества запросов и для всех последующих;
- цифра+шаг — вернуть ошибку для указанного количества и для последующих с указанным шагом.
Например, сообщим uname, что системного вызова uname не существует:
sudo strace -e fault=uname uname
В выводе видим, что система вернула программе нашу ошибку, а потом та с помощью вызова write говорит пользователю, что узнать версию и называние системы невозможно.
5. ФИЛЬТРАЦИЯ ПО ПУТИ
Если вас интересует не определённый вызов, а все операции с нужным файлом, то можно выполнить фильтрацию по нему с помощью опции -P. Например, меня интересует, действительно ли утилита lscpu обращается к файлу /proc/cpuinfo, чтобы узнать информацию о процессоре:
strace -P /proc/cpuinfo lscpu
И в результате мы видим, что действительно обращается. Она открывает его для чтения с помощью вызова openat.
6. СТАТИСТИКА СИСТЕМНЫХ ВЫЗОВОВ
С помощью опции -с вы можете собрать статистику для системных вызоWow, которые использует программа. Например, сделаем это для nautilus:
sudo strace -c nautilus
Во время работы утилита ничего выводить не будет. Результат будет рассчитан и выведен, когда вы завершите отладку. В выводе будут такие колонки:
- time — процент времени от общего времени выполнения системных вызовов;
- seconds — общее количество секунд, затраченное на выполнение системных вызоWow этого типа;
- calls — количество обращений к вызову;
- errors — количество ошибок;
- syscall — имя системного вызова.
Если вы хотите получать эту информацию в режиме реального времени, используйте опцию -C.
7. ОТСЛЕЖИВАНИЕ ВРЕМЕНИ ВЫПОЛНЕНИЯ
Чтобы отображать время выполнения каждого системного вызова, используйте опцию -t:
Можно также отображать микросекунды:
strace -tt uname
Или отображать время в формате UNIX :
strace -ttt uname
Чтобы добавить время выполнения вызова, добавьте -T:
strace -ttt -T uname
Для примера возьмем простую программу на С, которая выводит содержимое указанного файла:
[codesyntax lang=»php» blockstate=»collapsed»]
Источник: sidmid.ru