Комментарии 30
в /var/log/circusd было два файла: stage-svcname-stderr.log и staging-svcname.stderr.log. Я тогда воспользовался для автозавершения команды клавишей Tab, и тот файл, который был выбран автоматически, оказался не тем, что был нужен мне.Какое «автоматически», если линуксовый Tab (в отличие от виндового) не подставляет полное имя, пока не будет однозначного соответствия?
$ tail /var/log/circusd/staging<Tab>
Как вариант
stage-svcname-stderr.log
staging-svcname.stderr.log
То есть достаточно было ввести
.../stagi
и нажать Tabreadme
readme.txt
tab подставит полное имя readme
Но в случае топикстартера, скорее всего он нажал tab, и не глядя все варианты добил e и tab, ибо не знал что кроме stage может быть staging.
Но в этом случае автокомплит не вставит пробел после имени файла!
Может у него в .inputrc TAB: menu-complete
и Tab он нажал пару раз.
Линуксовый таб сильно настраивается, особенно если вы используете zsh, которая через zstyle позволяет сделать с автодополнением практически всё, что вам может придти в голову, включая, к примеру, проигрывание музыки при каждом нажатии tab без ущерба для собственно автодополнения. Аналог TAB: menu-complete
у zsh, кстати, по‐умолчанию стоит. Хотя как просто сделать автоподстановку первого же соответствия (аналог Vim с set wildmode=full
) по первому же нажатию tab я не нашёл (что не значит, что такого нет), но непросто (т.е. не через zstyle) это всегда можно сделать разными способами. (С set wildmode=full
Vim как раз будет имитировать автоподстановку как в cmd.exe.)
Хотя как просто сделать автоподстановку первого же соответствия (аналог Vim с set wildmode=full) по первому же нажатию tab я не нашёл
Быть может
zstyle ':completion:*' menu yes
или
bindkey '^i' menu-complete
?
Гм, так просто… Только со второй командой получилось что нужно. Только с первой нет (проверял под zsh -f
). Обе одновременно не проверял.
Ещё убрать меню и получится копия автодополнения cmd.exe, но зачем такое нужно? Заявленное затруднение вы разрешили.
Только с первой нет (проверял под zsh -f).
Стиль menu используется "новой" системой автодополнения, которую нужно проиницилизировать (autoload -Uz compinit && compinit).
но зачем такое нужно?
Если кандидатов для автодополнения мало, скажем меньше 7, быстрее добраться до желаемого перебором, нежели уточнять запрос.
# ls
lsattr lsblk lscpu lsdiff lsinitrd lsipc lslocks lslogins lsmod lsns lspci lsscsi
Во-вторых, расскажу про еще один комбо lsof, которым я отловил баг буквально пару часов назад: это поиск файлов, которые удалены, но в ОС остались открытые хэндлы на них. Такие файлы не получится найти поиском по ФС, но в выводе lsof они будут помечены "(deleted)".
Если кто не в курсе, пока есть хоть один открытый хэндл — место, занимаемое файлом, не будет отмечено, как свободное. Например, имеем какой-нибудь сервис, который пишет большооой лог, гигов на дцать. Вы это безобразие пресекаете — удалив .log, но если процесс не перезапускать, то он будет успешно продолжать добавлять данные в удалённый файл, и продолжать занимать место на диске =)
Вот пример, процессы sftpd держат файлы логов по 3.6 гб:
vsftpd 7471 ftp 4w REG 253,0 3658604713 134466821 /var/log/xferlog-20170814 (deleted)
Я понимаю, что у больших дядей виртуализация, докер, облака — но у реальных (не голливудских) стартапов обычно ничего этого нет. Есть один физический сервер, и в какой-то момент на нём заканчивается место на диске.
Вы втыкаете в сервер новый жёсткий диск, ибо hotplug, и хотите перенести на него, например, раздел /var (который раньше был в разделе /) — желательно, не отправляя сервер в оффлайн на пару часов.
И тут оказывается, что в /var/log/, /var/run/, /var/wtf/ гадит примерно всё.
И вот тут на помощь приходит lsof. Смотрите открытые файлы — правите конфиги — рестартите сервис.
А причина обычно в том, что какой-то из процессов ядра занял файл. Сваппинг, любой из модулей, использующий device mapper, биндинг, nfs-сервер, iscsi target, само ядро с partition table, loop… Список длинный.
Опция -U позволяет вывести все файлы сокетов домена Unix.Омг. Так доменные сокеты еще никто не называл. Неужели так сложно перед публикацией дать вычитать перевод специалисту?
Почитайте его код, прогоните стрейсом — и вы перестанете получать удовольствие от пользования им
Удивительно полезный инструмент: lsof