-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathREADME.md.bak
More file actions
96 lines (64 loc) · 7.74 KB
/
Copy pathREADME.md.bak
File metadata and controls
96 lines (64 loc) · 7.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
### 1) Какой системный вызов делает команда cd? В прошлом ДЗ мы выяснили, что cd не является самостоятельной программой, это shell builtin, поэтому запустить strace непосредственно на cd не получится. Тем не менее, вы можете запустить strace на /bin/bash -c 'cd /tmp'. В этом случае вы увидите полный список системных вызовов, которые делает сам bash при старте. Вам нужно найти тот единственный, который относится именно к cd.
Из вывода strace /bin/bash -c 'cd /tmp':
stat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0
chdir("/tmp")
На мой взгляд он делает два вызова. Проверка и переход.
### 2) Попробуйте использовать команду file на объекты разных типов на файловой системе. Используя strace выясните, где находится база данных file на основании которой она делает свои догадки.
Лоакальная пользовательская база находится в /etc/magic, но это файл не является текущей системной БД.
openat(AT_FDCWD, "/etc/magic", O_RDONLY) = 3
Предположительно база находится здесь:
openat(AT_FDCWD, "/usr/share/misc/magic.mgc", O_RDONLY) = 3
Вернее здесь /usr/lib/file/magic.mgc (файл выше это симлинк).
### 3) Предположим, приложение пишет лог в текстовый файл. Этот файл оказался удален (deleted в lsof), однако возможности сигналом сказать приложению переоткрыть файлы или просто перезапустить приложение – нет. Так как приложение продолжает писать в удаленный файл, место на диске постепенно заканчивается. Основываясь на знаниях о перенаправлении потоков предложите способ обнуления открытого удаленного файла (чтобы освободить место на файловой системе).
Необходимо найти файловый дескриптор (есть в выводе lsof) и обнулить его. Например так:
echo -n "" > /proc/pid/fd/number
### 4) Занимают ли зомби-процессы какие-то ресурсы в ОС (CPU, RAM, IO)?
Ресурсы ОС (CPU, RAM, IO) зомби процесс не занимает, но занимает записи в таблице процессов, которая ограничена.
### 5) В iovisor BCC есть утилита opensnoop:
### root@vagrant:~# dpkg -L bpfcc-tools | grep sbin/opensnoop
### /usr/sbin/opensnoop-bpfcc'''
### На какие файлы вы увидели вызовы группы open за первую секунду работы утилиты? Воспользуйтесь пакетом bpfcc-tools для Ubuntu 20.04. Дополнительные сведения по установке.
Файлы /var/run/utmp и /usr/local/share/dbus-1/system-services, /usr/share/dbus-1/system-services, /lib/dbus-1/system-services (см. ниже).
TIME(s) PID COMM FD ERR FLAGS PATH
0.000000000 859 vminfo 6 0 02100000 /var/run/utmp
0.000616000 595 dbus-daemon -1 2 02304000 /usr/local/share/dbus-1/system-services
0.000721000 595 dbus-daemon 18 0 02304000 /usr/share/dbus-1/system-services
0.000990000 595 dbus-daemon -1 2 02304000 /lib/dbus-1/system-services
### 6) Какой системный вызов использует uname -a? Приведите цитату из man по этому системному вызову, где описывается альтернативное местоположение в /proc, где можно узнать версию ядра и релиз ОС.
uname -a использует вызов uname. Из вывода strace:
uname({sysname="Linux", nodename="vagrant", ...}) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
uname({sysname="Linux", nodename="vagrant", ...}) = 0
uname({sysname="Linux", nodename="vagrant", ...}) = 0
Цитата:
Part of the utsname information is also accessible via /proc/sys/kernel/{ostype, hostname, osrelease, version, domainname}.
### 7) Чем отличается последовательность команд через ; и через && в bash? Есть ли смысл использовать в bash &&, если применить set -e?
Разница в том, что ";" обеспечивает последоватеьлное выполнение комманд, тогда как && в случае, если результат предыдущего true (нулевой код завершения).
Результат выполнения двух скриптов ниже, это "+++ exited with 1 +++". Bash && на мой взгляд более универсален, так как можно использоввать непосредственно для определенных конструкциях команд и не менять поведение для всего скрипта/команды. set -e настройка глобальная и может быть удобна при отладке.
vagrant@vagrant:~$ cat test1.sh
#!/bin/sh
set -e
test -d /tmp/some_dir; echo Hi
vagrant@vagrant:~$ cat test2.sh
#!/bin/sh
test -d /tmp/some_dir && echo Hi
### 8) Из каких опций состоит режим bash set -euxo pipefail и почему его хорошо было бы использовать в сценариях?
-o pipefail вовращает ноль, если какая-то команда в пайпе завершено с ненулевым кодом.
-e выход немедленно, если комманда завершена с ненулевым кодом
-x печатать команды и аргуементы в процессе исполнения
XXX -u Treat unset variables as an error when substituting.
Из документации:
-e Exit immediately if a command exits with a non-zero status.
-u Treat unset variables as an error when substituting.
-x Print commands and their arguments as they are executed.
-o pipefail - the return value of a pipeline is the status of
the last command to exit with a non-zero status,
or zero if no command exited with a non-zero status
### 9) Используя -o stat для ps, определите, какой наиболее часто встречающийся статус у процессов в системе. В man ps ознакомьтесь (/PROCESS STATE CODES) что значат дополнительные к основной заглавной буквы статуса процессов. Его можно не учитывать при расчете (считать S, Ss или Ssl равнозначными).
vagrant@vagrant:~$ ps ax -o stat | sort | grep -c "^S"
49
vagrant@vagrant:~$ ps ax -o stat | sort | grep -c "^I"
44
Наибольшее кол-во процессов в состоянии S (спящие процессы)
S interruptible sleep (waiting for an event to complete)
I Idle kernel thread