К каким файлам обращается программа linux

Зачастую пользователям и системным администратором необходимо отслеживать, к каким файлам обращается приложение. В 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru