Чем отличается uname a от uname
Размеры массивов в struct utsname не определены (см. ЗАМЕЧАНИЯ); поля завершаются байтом с null (‘\0’).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
ОШИБКИ
EFAULT Значение buf не определено.
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SVr4. Вызов uname() отсутствует в 4.3BSD. Поле domainname (доменное имя NIS или YP) является расширением GNU.
ЗАМЕЧАНИЯ
Это системный вызов, и операционная система, предположительно, знает своё имя, номер выпуска и версию. Она также знает, на каком аппаратном обеспечении она работает. Таким образом, четыре поля структуры несут полезную информацию. С другой стороны, поле nodename её не несет: оно указывает имя машины в некой неопределённой сети, но обычно машины находятся в более чем одной сети и имеют несколько имён. Более того, ядро не может каким-либо образом получить информацию о таких вещах, поэтому ему необходимо сообщить что же возвращать в этом поле. То же относится и к дополнительному полю domainname. С этой целью в Linux используются системные вызовы sethostname(2) и setdomainname(2). Обратите внимание, что хотя не существует стандарта, который бы указывал, что имя машины, установленное sethostname(2), является той же строкой, что возвращается в поле nodename при вызове uname(), для Linux это именно так (в действительности некоторые системы позволяют 256-символьное имя машины и 8-символьное имя узла). То же относится и к setdomainname(2) и полю domainname. Длина полей в структуре может быть различна. Некоторые операционные системы или библиотеки используют жёстко заданные значения 9, 33, 65 или 257. Другие используют константы SYS_NMLN, _SYS_NMLN, UTSLEN и _UTSNAME_LENGTH. Несомненно, идея использовать эти константы не очень хороша — можно просто использовать sizeof(. ). Часто выбирается 257 для того, чтобы имелось достаточно места для хранения имени машины в сети интернет. Часть информации из структуры utsname может быть получена также через /proc/sys/kernel/ ostype, hostname, osrelease, version, domainname>.
Отличия между библиотекой C и ядром
Со временем, увеличение размера структуры utsname последовательно привело к трём версиям uname(): sys_olduname() (слот __NR_oldolduname), sys_uname() (слот __NR_olduname) и sys_newuname() (слот __NR_uname). В первой длина каждого поля равна 9; во второй 65; в третьей также 65, но добавилось поле domainname. Обёрточная функция uname() в glibc скрывает эти подробности от приложений, вызывая самую новую версию системного вызова, предоставляемого ядром.
помогите ответить на вопрос 🙂
При регистрации на форуме требует ответить на вопрос:
What is the output of «date -u +%j$(uname)|sha256sum|sed ‘s/\W//g’»?
А я понятия не имею что это значит. Напишите нужное значение плз и если не трудно, то расскажите в двух словах что это вообще такое.

from_by
09.12.10 16:41:12 MSK
← 1 2 →

Ты все еще уверен что тебе нужен форум на котором ты не можешь даже зарегистрироваться ?
Mitsumi
( 09.12.10 16:43:54 MSK )

Это что ж за форум такой? И ты уверен, что тебе туда надо, если ты не можешь ответить на этот вопрос?
Ramen ★★★★
( 09.12.10 16:44:22 MSK )
А я понятия не имею что это значит.
Ути-пути, какие мы толстенькие. А в консоль подставить и Enter нажать, значит, не судьба?
Eddy_Em ☆☆☆☆☆
( 09.12.10 16:45:32 MSK )
Не понял, проблема в терминал скопировать и выполнить?
Shlyapa ★★
( 09.12.10 16:46:00 MSK )

Запусти в терминале.
//Да, я знаю, что в твоей шind0ш$ нет этих команд, лол.
GotF ★★★★★
( 09.12.10 16:46:28 MSK )

Вот так они превентивно вычисляют джобсолизов и некрофилов.
dikiy ★★☆☆☆
( 09.12.10 16:47:38 MSK )
Ответ на: комментарий от Shlyapa 09.12.10 16:46:00 MSK

>проблема в терминал скопировать и выполнить?
MrHouse ★
( 09.12.10 16:47:39 MSK )

Это круче любой матан капчи, да)
different_thing
( 09.12.10 16:48:46 MSK )
Ответ на: комментарий от MrHouse 09.12.10 16:47:39 MSK

ну если ТС думает так. то ему туда точно не надо )
megabaks ★★★★
( 09.12.10 16:49:20 MSK )
Ответ на: комментарий от MrHouse 09.12.10 16:47:39 MSK
Элементарное включение мозга подсказывает, что это — просто sha256-хэш комбинации номера дня в году и названия ОС 🙂
Eddy_Em ☆☆☆☆☆
( 09.12.10 16:49:38 MSK )
Ответ на: комментарий от dikiy 09.12.10 16:47:38 MSK

а sha чтоб не сразу спалили.
dikiy ★★☆☆☆
( 09.12.10 16:49:42 MSK )
Ответ на: комментарий от GotF 09.12.10 16:46:28 MSK

>Запусти в терминале.
от рута обязательно! вот так вирусы придут в линукс
RedPossum ★★★★★
( 09.12.10 16:50:10 MSK )
Вот только мне интересно, эта капча на все uname рассчитана, что ли? Да и date -u +%j в пределах Шарика отличается на 1.
Eddy_Em ☆☆☆☆☆
( 09.12.10 16:50:54 MSK )

Если не сработает, то это:
dikiy ★★☆☆☆
( 09.12.10 16:51:03 MSK )
Ответ на: комментарий от RedPossum 09.12.10 16:50:10 MSK

я тебе лично гарантирую — это безопасно, параноик ты наш :3
megabaks ★★★★
( 09.12.10 16:51:39 MSK )
Ответ на: комментарий от dikiy 09.12.10 16:51:03 MSK

у тебя перацкий линукс :3
4e0ead6db6c4afe60b7829755a6f314dfae12236830cbfab8cdb5355da959961
megabaks ★★★★
( 09.12.10 16:52:19 MSK )
Ответ на: комментарий от Eddy_Em 09.12.10 16:50:54 MSK

>Вот только мне интересно, эта капча на все uname рассчитана, что ли? Да и date -u +%j в пределах Шарика отличается на 1.
Оно может вполне себе два варианта пропускать.
Ну и может быть такое, что uname только определенный пропускают 🙂
dikiy ★★☆☆☆
( 09.12.10 16:52:28 MSK )
Ответ на: комментарий от dikiy 09.12.10 16:51:03 MSK
Ну ладно, в первом у вас мастдай, а во втором что? 🙂
Eddy_Em ☆☆☆☆☆
( 09.12.10 16:53:02 MSK )
Ответ на: комментарий от dikiy 09.12.10 16:52:28 MSK
sha256sum берется от комбинации uname и дня года.
Eddy_Em ☆☆☆☆☆
( 09.12.10 16:53:45 MSK )

Ramen ★★★★
( 09.12.10 16:54:06 MSK )
Ответ на: комментарий от Eddy_Em 09.12.10 16:53:02 MSK

>Ну ладно, в первом у вас мастдай, а во втором что? 🙂
dikiy ★★☆☆☆
( 09.12.10 16:54:39 MSK )
Ответ на: комментарий от dikiy 09.12.10 16:49:42 MSK

Сможешь судить о uname по чексумме?
GotF ★★★★★
( 09.12.10 16:54:44 MSK )
Ответ на: комментарий от dikiy 09.12.10 16:52:28 MSK

>Ну и может быть такое, что uname только определенный пропускают 🙂
Ну очевидно, что на форуме арча.
Ramen ★★★★
( 09.12.10 16:54:58 MSK )
Ответ на: комментарий от megabaks 09.12.10 16:52:19 MSK

flareguner ★
( 09.12.10 16:55:39 MSK )

Может, на этом форуме сделать такой же вопрос при регистрации и отправке анонимных комментариев? А кто не ответит, тому разрешить писать только в Linux-install.
proud_anon ★★★★★
( 09.12.10 16:55:42 MSK )
Ответ на: комментарий от dikiy 09.12.10 16:54:39 MSK
Eddy_Em ☆☆☆☆☆
( 09.12.10 16:56:34 MSK )
Ответ на: комментарий от GotF 09.12.10 16:54:44 MSK

>можешь судить о uname по чексумме?
dikiy ★★☆☆☆
( 09.12.10 16:56:47 MSK )
Ответ на: комментарий от Eddy_Em 09.12.10 16:56:34 MSK

dikiy ★★☆☆☆
( 09.12.10 16:57:05 MSK )
Ответ на: комментарий от proud_anon 09.12.10 16:55:42 MSK
Отличный вариант! Зашел анонимус на ЛОР, пусть сначала введет выхлоп какой-нибудь эдакой команды 🙂
Eddy_Em ☆☆☆☆☆
( 09.12.10 16:57:37 MSK )
Ответ на: комментарий от dikiy 09.12.10 16:57:05 MSK

тьфу ты — а я про икс то и забыл %)
megabaks ★★★★
( 09.12.10 16:57:46 MSK )
Ответ на: комментарий от dikiy 09.12.10 16:57:05 MSK
Так и думал, только я просто MacOS проверял.
Eddy_Em ☆☆☆☆☆
( 09.12.10 16:57:54 MSK )
Ответ на: комментарий от proud_anon 09.12.10 16:55:42 MSK

Отличная мысль. Напиши в L.O.R.
GotF ★★★★★
( 09.12.10 16:57:56 MSK )
Ответ на: комментарий от dikiy 09.12.10 16:56:47 MSK

GotF ★★★★★
( 09.12.10 16:59:00 MSK )
Кстати, а куда это наш толстячок из Беларуси подевался? 🙂
Eddy_Em ☆☆☆☆☆
( 09.12.10 16:59:05 MSK )
Ответ на: комментарий от Eddy_Em 09.12.10 16:57:37 MSK

>Отличный вариант! Зашел анонимус на ЛОР, пусть сначала введет выхлоп какой-нибудь эдакой команды 🙂
Прикинь. Зашел новичок на ЛОР. Ну ему грят, пока вот эту команду не выполнишь, будешь только в Linux-install писать. Ну вот он пишет. С горем пополам ставит линух. С трепетом вводит заветную команду. И вот он снова пишет в Linux-install 🙂
dikiy ★★☆☆☆
( 09.12.10 16:59:27 MSK )
Ответ на: комментарий от dikiy 09.12.10 16:52:28 MSK

>Ну и может быть такое, что uname только определенный пропускают 🙂
Зачем? Может, я сижу на Убунте, хочу поставить Arch, и у меня проблема. А спросить не могу, поскольку на форум без Арча не пускают.
Или, например, если я сам себе соберу ведро, у меня uname будет другой.
proud_anon ★★★★★
( 09.12.10 17:00:17 MSK )
Ответ на: комментарий от dikiy 09.12.10 16:59:27 MSK
Это про ту жестокую подставу на sed?
Eddy_Em ☆☆☆☆☆
( 09.12.10 17:00:40 MSK )
Ответ на: комментарий от Eddy_Em 09.12.10 17:00:40 MSK

>Это про ту жестокую подставу на sed?
dikiy ★★☆☆☆
( 09.12.10 17:01:12 MSK )
Ответ на: комментарий от proud_anon 09.12.10 17:00:17 MSK
Если у тебя линукс, то и в uname будет Linux. А вот если какая-нибудь бздя или солярка, то uname будет другим.
Eddy_Em ☆☆☆☆☆
( 09.12.10 17:01:29 MSK )
Ответ на: комментарий от proud_anon 09.12.10 17:00:17 MSK

>Зачем? Может, я сижу на Убунте, хочу поставить Arch, и у меня проблема. А спросить не могу, поскольку на форум без Арча не пускают.
И Убунту и Арч дадут одинаковый выхлор при uname -u. Они дадут Linux.
dikiy ★★☆☆☆
( 09.12.10 17:02:06 MSK )
Ответ на: комментарий от Eddy_Em 09.12.10 17:01:29 MSK

А, да, точно, там же uname, а не «uname -a». Блин, невнимателен.
proud_anon ★★★★★
( 09.12.10 17:03:29 MSK )

Так, парни, остановитесь 🙂 Вы стали объектами для эксперемента. Сейчас за пивом с другом обсуждали, что одной из причин низкой популярности линукса является низкая дружелюбность комьюнити. Попутно я решил зарегиться на archlinux.org ( ради ветки про браузер jumanji на который хочу перейти). Увидели эту странную капча, и родился спор на 5$ о том увидим ли мы адекватный ответ, задав такой вопрос на лоре или нет (я за то что напишут, а друг -нет). Так блягодаря megabaks я стал богаче на 5 бачей 🙂
from_by
( 09.12.10 17:07:16 MSK ) автор топика
Ответ на: комментарий от GotF 09.12.10 16:57:56 MSK

>Отличная мысль. Напиши в L.O.R.
Пусть напишут те, кто считает это нужным. 🙂
proud_anon ★★★★★
( 09.12.10 17:08:59 MSK )
Ответ на: комментарий от from_by 09.12.10 17:07:16 MSK

Теперь придётся тебя убить.
Команда Linux uname
В Linux команда uname используется для печати базовой системной информации. Обычно она вызывается с опцией -a для отображения всей доступной информации.

Содержание
- Синтаксис
- Опции
- Примеры использования команды uname в Linux
- Использование с опцией -a
- Использование с определённой опцией
- Комбинирование опций
Синтаксис
uname [ПАРАМЕТР]Опции
-a, —all Вывести всю информацию -s, —kernel-name Вывести имя ядра -n, —nodename Вывести имя машины в сети (имя хоста) -r, —kernel-release Вывести информацию о выпуске ядра -v, —kernel-version Вывести версию ядра -m, —machine Вывести тип оборудования машины -p, —processor Вывести тип процессора -i, —hardware-platform Вывести тип аппаратной платформы -o, —operating-system Вывести название операционной системы
При вызове без каких-либо параметров uname выведет имя ядра, как если бы был указан параметр -s .
Примеры использования команды uname в Linux
Использование с опцией -a
Обычно команда используется с опцией -a для вывода всей доступной информации:
oleg@mobile:~:$ uname -a Linux mobile 5.18.14-arch1-1 #1 SMP PREEMPT_DYNAMIC Sat, 23 Jul 2022 11:46:17 +0000 x86_64 GNU/Linux oleg@mobile:~:$Вывод включает в себя следующую информацию:
Linux Имя ядра moble Имя хоста 5.18.14-arch1-1 Выпуск ядра #1 SMP PREEMPT_DYNAMIC Sat, 23 Jul 2022 11:46:17 +0000 Версия ядра x86_64 Имя аппаратного обеспечения машины GNU/Linux Название операционной системы
Использование с определённой опцией
Информация, отображаемая командой uname с опцией -a некоторым может быть трудна для чтения. В этом случае можно использовать лишь конкретные необходимые вам опции.
Например, если вам нужна конкретная информация о ядре вашей системы, например номер версии ядра, используйте uname с опцией -r :
oleg@mobile:~:$ uname -r 5.18.14-arch1-1 oleg@mobile:~:$Комбинирование опций
Опции можно комбинировать друг с другом для получения желаемого результата. Чтобы узнать, например, какая версия ядра Linux работает в вашей системе, используйте следующие опции -s , -r , -m :
oleg@mobile:~:$ uname -srm Linux 5.18.14-arch1-1 x86_64 oleg@mobile:~:$При использовании нескольких параметров информация, содержащаяся в выводе, находится в том же порядке, что и при использовании параметра -a . Положение заданных опций не имеет значения.
Выводы
Команда uname в Linux очень эффективна и позволяет получить всю возможную информацию об операционной системе, оборудовании, ядре и процессоре. Чтобы выяснить, почему часть программного обеспечения не работает должным образом, вам необходимо знать версию ядра, операционную систему и основные сведения об оборудовании. Следовательно, уметь работать с этой утилитой необходимо.
Разбираемся с системными вызовами в Linux с помощью strace

Системный вызов — это механизм взаимодействия пользовательских программ с ядром Linux, а strace — мощный инструмент, для их отслеживания. Для лучшего понимания работы операционной системы полезно разобраться с тем, как они работают.
В операционной системе можно выделить два режима работы:
- Режим ядра (kernel mode) — привилегированный режим, используемый ядром операционной системы.
- Пользовательский режим (user mode) — режим, в котором выполняется большинство пользовательских приложений.
Системные вызовы очень похожи на вызовы функций, в том смысле, что в них передаются аргументы и они возвращают значения. Единственное отличие состоит в том, что системные вызовы работают на уровне ядра, а функции нет. Переключение из пользовательского режима в режим ядра осуществляется с помощью специального механизма прерываний.
Большая часть этих деталей скрыта от пользователя в системных библиотеках (glibc в Linux-системах). Системные вызовы по своей природе являются универсальными, но несмотря на это, механика их выполнения во многом аппаратно-зависима.
В этой статье рассматривается несколько практических примеров анализа системных вызовов с помощью strace . В примерах используется Red Hat Enterprise Linux, но все команды должны работать и в других дистрибутивах Linux:
[root@sandbox ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.7 (Maipo) [root@sandbox ~]# [root@sandbox ~]# uname -r 3.10.0-1062.el7.x86_64 [root@sandbox ~]#Для начала убедитесь, что в вашей системе установлены необходимые инструменты. Проверить установлен ли strace можно с помощью приведенной ниже команды. Для просмотра версии strace запустите ее с параметром -V:
[root@sandbox ~]# rpm -qa | grep -i strace strace-4.12-9.el7.x86_64 [root@sandbox ~]# [root@sandbox ~]# strace -V strace -- version 4.12 [root@sandbox ~]#Если strace не установлен, то установите запустив:
yum install straceДля примера создайте тестовый каталог в /tmp и два файла с помощью команды touch :
[root@sandbox ~]# cd /tmp/ [root@sandbox tmp]# [root@sandbox tmp]# mkdir testdir [root@sandbox tmp]# [root@sandbox tmp]# touch testdir/file1 [root@sandbox tmp]# touch testdir/file2 [root@sandbox tmp]#(Я использую каталог /tmp только потому, что доступ к нему есть у всех, но вы можете использовать любой другой.)
С помощью команды ls проверьте, что в каталоге testdir создались файлы:
[root@sandbox tmp]# ls testdir/ file1 file2 [root@sandbox tmp]#Вероятно, вы используете команду ls каждый день, не осознавая того, что под капотом работают системные вызовы. Здесь в игру вступает абстракция. Вот как работает эта команда:
Утилита командной строки -> Функции системных библиотек (glibc) -> Системные вызовыКоманда ls вызывает функции из системных библиотек Linux (glibc). Эти библиотеки, в свою очередь, вызывают системные вызовы, которые выполняют большую часть работы.
Если вы хотите узнать, какие функции вызывались из библиотеки glibc, то используйте команду ltrace со следующей за ней командой ls testdir/ :
ltrace ls testdir/Если ltrace не установлен, то установите:
yum install ltraceНа экране будет много информации, но не беспокойтесь — мы это рассмотрим далее. Вот некоторые из важных библиотечных функций из вывода ltrace :
opendir("testdir/") = < 3 >readdir(< 3 >) = < 101879119, "." >readdir(< 3 >) = < 134, ".." >readdir(< 3 >) = < 101879120, "file1" >strlen("file1") = 5 memcpy(0x1665be0, "file1\0", 6) = 0x1665be0 readdir(< 3 >) = < 101879122, "file2" >strlen("file2") = 5 memcpy(0x166dcb0, "file2\0", 6) = 0x166dcb0 readdir(< 3 >) = nil closedir(< 3 >)Изучив этот вывод, вы, вероятно, поймете, что происходит. Каталог с именем testdir открывается с помощью библиотечной функции opendir , после чего следуют вызовы функций readdir , читающих содержимое каталога. В конце происходит вызов функции closedir , которая закрывает каталог, открытый ранее. Пока проигнорируйте остальные функции, такие как strlen и memcpy .
Как вы видите, можно легко посмотреть вызываемые библиотечные функции, но в этой статье мы сфокусируемся на системных вызовах, которые вызываются функциями системных библиотек.
Для просмотра системных вызовов используйте strace с командой ls testdir , как показано ниже. И вы снова получите кучу бессвязной информации:
[root@sandbox tmp]# strace ls testdir/ execve("/usr/bin/ls", ["ls", "testdir/"], [/* 40 vars */]) = 0 brk(NULL) = 0x1f12000 >> write(1, "file1 file2\n", 13file1 file2 ) = 13 close(1) = 0 munmap(0x7fd002c8d000, 4096) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++ [root@sandbox tmp]#В результате выполнения strace вы получите список системных вызовов, выполненных при работе команды ls . Все системные вызовы можно разделить на следующие категории:
- Управление процессами
- Управление файлами
- Управление каталогами и файловой системой
- Прочие
[root@sandbox tmp]# strace -o trace.log ls testdir/ file1 file2 [root@sandbox tmp]#На этот раз на экране не будет никаких данных — команда ls отработает, как и ожидается, показав список файлов и записав весь вывод strace в файл trace.log . Для простой команды ls файл содержит почти 100 строк:
[root@sandbox tmp]# ls -l trace.log -rw-r--r--. 1 root root 7809 Oct 12 13:52 trace.log [root@sandbox tmp]# [root@sandbox tmp]# wc -l trace.log 114 trace.log [root@sandbox tmp]#Взгляните на первую строку в файле trace.log :
execve("/usr/bin/ls", ["ls", "testdir/"], [/* 40 vars */]) = 0- В начале строки находится имя выполняемого системного вызова — это execve.
- Текст в круглых скобках — это аргументы, передаваемые системному вызову.
- Число после знака = (в данном случае 0) — это значение, возвращаемое системным вызовом.
Обратите внимание на ту единственную команду, которую вы вызвали — ls testdir . Вам известно имя каталога, используемое командой ls , так почему бы не воспользоваться grep для testdir в файле trace.log и не посмотреть, что найдется? Посмотрите внимательно на результат:
[root@sandbox tmp]# grep testdir trace.log execve("/usr/bin/ls", ["ls", "testdir/"], [/* 40 vars */]) = 0 stat("testdir/", ) = 0 openat(AT_FDCWD, "testdir/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3 [root@sandbox tmp]#Возвращаясь к приведенному выше анализу execve , можете ли вы сказать, что делает следующий системный вызов?
execve("/usr/bin/ls", ["ls", "testdir/"], [/* 40 vars */]) = 0Не нужно запоминать все системные вызовы и то, что они делают: все есть в документации. Man-страницы спешат на помощь! Перед запуском команды man убедитесь, что установлен пакет man-pages :
[root@sandbox tmp]# rpm -qa | grep -i man-pages man-pages-3.53-5.el7.noarch [root@sandbox tmp]#Помните, что вам нужно добавить «2» между командой man и именем системного вызова. Если вы прочитаете в man про man ( man man ), то увидите, что раздел 2 зарезервирован для системных вызовов. Аналогично если вам нужна информация о библиотечных функциях, то нужно добавить 3 между man и именем библиотечной функции.
Ниже приведены номера разделов man :
1. Выполняемые программы или команды для командной оболочки. 2. Системные вызовы (функции, предоставляемые ядром). 3. Библиотечные вызовы (функции программных библиотек). 4. Специальные файлы (которые обычно находятся в /dev).Для просмотра документации по системному вызову запустите man с именем этого системного вызова.
man 2 execveВ соответствии с документацией системный вызов execve выполняет программу, которая передается ему в параметрах (в данном случае это ls ). В него также передаются дополнительные параметры для ls. В этом примере это testdir . Следовательно, этот системный вызов просто запускает ls с testdir в качестве параметра:
'execve - execute program' 'DESCRIPTION execve() executes the program pointed to by filename'В следующий системный вызов stat передается параметр testdir :
stat("testdir/", ) = 0Для просмотра документации используйте man 2 stat . Системный вызов stat возвращает информацию об указанном файле. Помните, что все в Linux — файл, включая каталоги.
Далее системный вызов openat открывает testdir . Обратите внимание, что возвращается значение 3. Это дескриптор файла, который будет использоваться в последующих системных вызовах:
openat(AT_FDCWD, "testdir/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3Теперь откройте файл
trace.logи обратите внимание на строку, следующую после системного вызова openat . Вы увидите системный вызов getdents , который делает большую часть необходимой работы для выполнения команды ls testdir . Теперь выполним grep getdents для файла trace.log :
[root@sandbox tmp]# grep getdents trace.log getdents(3, /* 4 entries */, 32768) = 112 getdents(3, /* 0 entries */, 32768) = 0 [root@sandbox tmp]#В документации ( man getdents ) говорится, что getdents читает записи каталога, это, собственно, нам и нужно. Обратите внимание, что аргумент для getdent равен 3 — это дескриптор файла, полученный ранее от системного вызова openat .
Теперь, когда получено содержимое каталога, нужен способ отобразить информацию в терминале. Итак, делаем grep для другого системного вызова write , который используется для вывода на терминал:
[root@sandbox tmp]# grep write trace.log write(1, "file1 file2\n", 13) = 13 [root@sandbox tmp]#В аргументах вы можете видеть имена файлов, которые будут выводится: file1 и file2 . Что касается первого аргумента (1), вспомните, что в Linux для любого процесса по умолчанию открываются три файловых дескриптора:
- 0 — стандартный поток ввода
- 1 — стандартный поток вывода
- 2 — стандартный поток ошибок
Теперь вы знаете, какие системные вызовы сделали большую часть работы для команды ls testdir/ . Но что насчет других 100+ системных вызовов в файле trace.log ?
Операционная система выполняет много вспомогательных действий для запуска процесса, поэтому многое из того, что вы видите в файле trace.log — это инициализация и очистка процесса. Посмотрите файл trace.log полностью и попытайтесь понять, что происходит во время запуска команды ls .
Теперь вы можете анализировать системные вызовы для любых программ. Утилита strace так же предоставляет множество полезных параметров командной строки, некоторые из которых описаны ниже.
По умолчанию strace отображает не всю информацию о системных вызовах. Однако у нее есть опция -v verbose , которая покажет дополнительную информацию о каждом системном вызове:
strace -v ls testdirХорошая практика использовать параметр -f для отслеживания дочерних процессов, созданных запущенным процессом:
strace -f ls testdirА если вам нужны только имена системных вызовов, количество их запусков и процент времени, затраченного на выполнение? Вы можете использовать опцию -c , чтобы получить эту статистику:
strace -c ls testdir/Если вы хотите отследить определенный системный вызов, например, open , и проигнорировать другие, то можно использовать опцию -e с именем системного вызова:
[root@sandbox tmp]# strace -e open ls testdir open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3 open("/lib64/libcap.so.2", O_RDONLY|O_CLOEXEC) = 3 open("/lib64/libacl.so.1", O_RDONLY|O_CLOEXEC) = 3 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 open("/lib64/libpcre.so.1", O_RDONLY|O_CLOEXEC) = 3 open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 open("/lib64/libattr.so.1", O_RDONLY|O_CLOEXEC) = 3 open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 file1 file2 +++ exited with 0 +++ [root@sandbox tmp]#А что, если нужно отфильтровать по нескольким системным вызовам? Не волнуйтесь, можно использовать ту же опцию -e и разделить необходимые системные вызовы запятой. Например, для write и getdent :
[root@sandbox tmp]# strace -e write,getdents ls testdir getdents(3, /* 4 entries */, 32768) = 112 getdents(3, /* 0 entries */, 32768) = 0 write(1, "file1 file2\n", 13file1 file2 ) = 13 +++ exited with 0 +++ [root@sandbox tmp]#До сих пор мы отслеживали только явный запуск команд. Но как насчет команд, которые были запущены ранее? Что, если вы хотите отслеживать демонов? Для этого у strace есть специальная опция -p , которой вы можете передать идентификатор процесса.
Мы не будем запускать демона, а используем команду cat , которая отображает содержимое файла, переданного ему в качестве аргумента. Но если аргумент не указать, то команда cat будет просто ждать ввод от пользователя. После ввода текста она выведет введенный текст на экран. И так до тех пор, пока пользователь не нажмет Ctrl+C для выхода.
Запустите команду cat на одном терминале.
[root@sandbox tmp]# catНа другом терминале найдите идентификатор процесса (PID) с помощью команды ps :
[root@sandbox ~]# ps -ef | grep cat root 22443 20164 0 14:19 pts/0 00:00:00 cat root 22482 20300 0 14:20 pts/1 00:00:00 grep --color=auto cat [root@sandbox ~]#Теперь запустите strace с опцией -p и PID’ом, который вы нашли с помощью ps . После запуска strace выведет информацию о процессе, к которому он подключился, а также его PID. Теперь strace отслеживает системные вызовы, выполняемые командой cat . Первый системный вызов, который вы увидите — это read, ожидающий ввода от потока с номером 0, то есть от стандартного ввода, который сейчас является терминалом, на котором запущена команда cat :
[root@sandbox ~]# strace -p 22443 strace: Process 22443 attached read(0,Теперь вернитесь к терминалу, где вы оставили запущенную команду cat , и введите какой-нибудь текст. Для демонстрации я ввел x0x0 . Обратите внимание, что cat просто повторил то, что я ввел и x0x0 на экране будет дважды.
[root@sandbox tmp]# cat x0x0 x0x0Вернитесь к терминалу, где strace был подключен к процессу cat . Теперь вы видите два новых системных вызова: предыдущий read , который теперь прочитал x0x0 , и еще один для записи write , который записывает x0x0 обратно в терминал, и снова новый read , который ожидает чтения с терминала. Обратите внимание, что стандартный ввод (0) и стандартный вывод (1) находятся на одном и том же терминале:
[root@sandbox ~]# strace -p 22443 strace: Process 22443 attached read(0, "x0x0\n", 65536) = 5 write(1, "x0x0\n", 5) = 5 read(0,Представляете, какую пользу может принести вам запуск strace для демонов: вы можете увидеть все, что делается в фоне. Завершите команду
Ctrl+CЭто также прекратит сеанс
straceтак как отслеживаемый процесс был прекращен.
Для просмотра отметок времени системных вызовов используйте опцию -t :
[root@sandbox ~]#strace -t ls testdir/ 14:24:47 execve("/usr/bin/ls", ["ls", "testdir/"], [/* 40 vars */]) = 0 14:24:47 brk(NULL) = 0x1f07000 14:24:47 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2530bc8000 14:24:47 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 14:24:47 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3А если вы хотите узнать время, проведенное между системными вызовами? Есть удобная опция -r , которая показывает время, затраченное на выполнение каждого системного вызова. Довольно полезно, не так ли?
[root@sandbox ~]#strace -r ls testdir/ 0.000000 execve("/usr/bin/ls", ["ls", "testdir/"], [/* 40 vars */]) = 0 0.000368 brk(NULL) = 0x1966000 0.000073 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb6b1155000 0.000047 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 0.000119 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3Заключение
Утилита strace очень удобна для изучения системных вызовов в Linux. Чтобы узнать о других параметрах командной строки, обратитесь к man и онлайн-документации.