Сегодня начнем тыкать полезную утилиту strace. Многим она кажется очень страшной, но на самом деле всё обстоит иначе. Если научишься с ней правильно работать и понимать, сможешь отдебажить любую ошибку и сразу станешь тимлидом, а может быть и техническим директором.
strace — это утилита, отслеживающая системные вызовы, которые представляют собой механизм трансляции, обеспечивающий интерфейс между процессом и операционной системой/ядром
Ну а если по русски: это полезный инструмент диагностики и отладки.
Начнем с простого. Для экспериментов нам понадобится файл test.txt, давай создадим его командой:
echo '12345' > test.txt
Опыты проводим над утилитой sed. Исследовать будем команду:
sed -i.tmp 's/1/2/' test.txt
Ключ -i означает редактирование файла на месте, принимает необязательный суффикс tmp. Если суффикс задан, то будет создана копия файла с предыдущим содержанием.
Команда s/// это команда замены, одного на другое. То есть в примере мы меняем (1) на (2) в файле test.txt
Погнали ковыряться
strace -ye '/^open',read,write,rename,close sed -i.tmp 's/1/2/' test.txt
Выведет много всего, но ты не бойся, тебе нужно посмотреть только последние несколько строчек. Всё остальное не достойно твоего внимания.
Посмотрим вывод с момента открытия файла test.txt
Теперь разберем построчно, что же произошло:
1. Открывается файл test.txt
2. Открывается временный файл sedvKFsXv
3. Из файла test.txt читаются 6 байт 12345\n
4. Пробует прочитать еще раз test.txt, вернулось 0 байт, найден конец строки
5. Закрывается файл test.txt
6. Записывается 6 байт 22345\n во временный файл sedvKFsXv
7. Закрывается временный файл sedvKFsXv
8. Переименовывается файл test.txt в test.txt.tmp
9. Переименовывается временный файл sedvKFsXv в test.txt
10. Что-то там где-то опять закрывается
➕ Подпишись на BashDays в телеграм
Если подытожить, получилось такое:
- Считывается исходный файл test.txt
- Во временный файл sedvKFsXv записывается обработанный текст
- Исходный файл test.txt становится резервной копией test.txt.tmp
- Временный файл sedvKFsXv становится текущим test.txt
Что нам дал этот эксперимент?
А дал он нам то, что всё работает. И теперь у нас есть понимание как это работает.
Допустим столкнулся ты с проблемой, что sed не смог что-то записать и ты не понимаешь почему. Запускаешь strace и смотришь почему:
write(4</tmp/sedvKFsXv>, "strace: exec: Permission denied\n", 6) = 6
Опа, а прав на запись в папку /tmp нет, возможно какой-то лось запретил туда запись. Отдебажили, фиксим: выставляем 3 топора (chmod 777) на папку /tmp и радуемся какие мы молодцы.
Этот способ отладки ты можешь применить не только для sed, но и для своих скриптов, программ, сервисов и т.п. Как нибудь в будущем поэкспериментируем с php и Битриксом.
Как-то так. Ничего же сложного? Ну вот и я про тоже. Главное не бояться и знать куда смотреть. Ну а я покажу куда смотреть и проведу тебя протоптанными дорожками.