Какие базовые команды Unix используете
Что проверяют
Сможете ли вы сами разобраться с сервисом на сервере или в контейнере: найти процесс, прочитать логи, понять, кто занял порт. Список команд интересен меньше, чем сценарии. Следом часто спрашивают, чем kill отличается от kill -9 и как Go-сервис должен реагировать на сигналы.
Как отвечать
Группируйте команды по задачам и к каждой добавляйте пример из работы:
- файлы и логи:
ls -la,less,tail -f app.log,grep -rn "timeout" .,find . -name "*.go" -mtime -1,jqдля JSON-логов; - процессы:
ps aux,topилиhtop.kill PIDотправляетSIGTERM, аkill -9отправляетSIGKILL, который перехватить нельзя; - сеть:
ss -tlnpилиlsof -i :8080, чтобы узнать, кто слушает порт,curl -vдля проверки ручки,digдля DNS; - диск и ресурсы:
df -h,du -sh *,free -m,ulimit -n, когда сервис упирается в лимит открытых файлов; - права:
chmod,chown, разница между битомxу файла и у каталога; - конвейеры:
|,>,2>&1,xargs, связка вродеgrep ERROR app.log | sort | uniq -c | sort -rn.
Затем свяжите с Go. Kubernetes и systemd при остановке шлют SIGTERM, и сервис должен дождаться текущих запросов: signal.NotifyContext(ctx, syscall.SIGTERM, os.Interrupt) и server.Shutdown(ctx). Профиль живого сервиса снимают через /debug/pprof/ и go tool pprof. Для внешних команд из кода есть os/exec, лучше exec.CommandContext, чтобы процесс завершался по таймауту.
Где спотыкаются
Первым делом делают kill -9. Процесс не успевает закрыть соединения и сбросить буферы, а сервис без обработки SIGTERM вообще обрывает запросы при каждом деплое.
Передают в exec.Command("sh", "-c", cmd) строку с пользовательским вводом. Это прямая инъекция команд, аргументы нужно передавать отдельными параметрами без оболочки.
Решают проблему с правами через chmod 777 и не могут объяснить, зачем каталогу нужен бит x.