И снова понедельник и снова на работу. Привет, коллеги. Надеюсь все живы, здоровы.
Сегодня начнем потихоньку тыкать полезную утилиту 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
Теперь разберем построчно, что же произошло:
- Открывается файл
HUY.txt - Открывается временный файл
sedvKFsXv - Из файла
HUY.txtчитаются 6 байт12345\n - Пробует прочитать еще раз
HUY.txt, вернулось 0 байт, найден конец строки - Закрывается файл
HUY.txt - Записывается 6 байт
22345\nво временный файлsedvKFsXv - Закрывается временный файл
sedvKFsXv - Переименовывается файл
HUY.txtвHUY.txt.tmp - Переименовывается временный файл
sedvKFsXvвHUY.txt - Что-то там где-то опять закрывается
Если подытожить, получилось такое:
- Считывается исходный файл
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 и Битриксом
Как-то так. Ничего же сложного? Ну вот и я про то же. Главное не бояться и знать куда смотреть. Ну а я покажу куда смотреть и проведу тебя протоптанными дорожками.
Ладно, пойду пельмени жарить, всем хорошего понедельника!








Комментарии