Сегодня начнем потихоньку тыкать полезную утилиту strace. Многим она кажется
strace — это утилита, отслеживающая системные вызовы, которые представляют собой механизм трансляции, обеспечивающий интерфейс между процессом и операционной системой/ядром
Ну а если по русски: это полезный инструмент диагностики и отладки.
Начнем с простого. Для экспериментов нам понадобится файл
HUY.txt, давай создадим его командой:echo '12345' > HUY.txtОпыты проводим над утилитой
sed. Исследовать будем команду:sed -i.tmp 's/1/2/' HUY.txtКлюч
-i означает редактирование файла на месте, принимает необязательный суффикс tmp. Если суффикс задан, то будет создана копия файла с предыдущим содержанием.Команда
s/// это команда замены, одного на другое. То есть в примере мы меняем (1) на (2) в файле HUY.txt
Погнали изучать кишкиstrace -ye '/^open',read,write,rename,close sed -i.tmp 's/1/2/' HUY.txtВыведет
Посмотрим вывод с момента открытия файла HUY.txt
1. openat(AT_FDCWD, "HUY.txt", O_RDONLY) = 3</tmp/HUY.txt>Теперь разберем построчно, что же произошло:
2. openat(AT_FDCWD, "./sedvKFsXv", O_RDWR|O_CREAT|O_EXCL, 0600) = 4 </tmp/sedvKFsXv>
3. read(3</tmp/HUY.txt>, "12345\n", 4096) = 6
4. read(3</tmp/HUY.txt>, "", 4096) = 0
5. close(3</tmp/HUY.txt>) = 0
6. write(4</tmp/sedvKFsXv>, "22345\n", 6) = 6
7. close(4</tmp/sedvKFsXv>) = 0
8. rename("HUY.txt", "HUY.txt.tmp") = 0
9. rename("./sedvKFsXv", "HUY.txt") = 0
10. close(1</dev/pts/0>) = 0
1. Открывается файл
HUY.txt
2. Открывается временный файл sedvKFsXv
3. Из файла HUY.txt читаются 6 байт 12345\n
4. Пробует прочитать еще раз HUY.txt, вернулось 0 байт, найден конец строки5. Закрывается файл
HUY.txt
6. Записывается 6 байт 22345\n во временный файл sedvKFsXv
7. Закрывается временный файл sedvKFsXv
8. Переименовывается файл HUY.txt в HUY.txt.tmp
9. Переименовывается временный файл sedvKFsXv в HUY.txt
10. Что-то там где-то опять закрываетсяЕсли подытожить, получилось такое:
- Считывается исходный файл
HUY.txt
- Во временный файл sedvKFsXv записывается обработанный текст- Исходный файл
HUY.txt становится резервной копией HUY.txt.tmp
- Временный файл sedvKFsXv становится текущим HUY.txt
Что нам дал этот эксперимент?А дал он нам то, что всё работает. И теперь у нас есть понимание как это работает.
Допустим столкнулся ты с проблемой, что
sed не смог что-то записать и ты не понимаешь почему. Запускаешь strace и смотришь почему:write(4</tmp/sedvKFsXv>, "strace: exec: Permission denied\n", 6) = 6Опа, а прав на запись в папку
/tmp нет, возможно какой-то лось дырявый запретил туда запись. Отдебажили, фиксим: выставляем 3 топора (chmod 777) на папку /tmp и радуемся какие мы молодцы.Этот способ отладки ты можешь применить не только для
sed, но и для своих скриптов, программ, сервисов и т.п. Как нибудь в будущем поэкспериментируем с php и Битриксом 🤡Как-то так. Ничего же сложного? Ну вот и я про тоже. Главное не бояться и знать куда смотреть. Ну а я покажу куда смотреть и проведу тебя протоптанными дорожками.
Ладно, пойду пельмени жарить, всем хорошего понедельника! 💗
tags: #debug
—
🟢 Подпишись: @bashdays