Как стать автором
Обновить

Комментарии 30

Не понял сей пассаж:
в /var/log/circusd было два файла: stage-svcname-stderr.log и staging-svcname.stderr.log. Я тогда воспользовался для автозавершения команды клавишей Tab, и тот файл, который был выбран автоматически, оказался не тем, что был нужен мне.
Какое «автоматически», если линуксовый Tab (в отличие от виндового) не подставляет полное имя, пока не будет однозначного соответствия?
$ tail /var/log/circusd/staging<Tab>

Как вариант
Tab просто добьёт имя файла до максимального совпадения (…/stage-svcname) и выведет в консоль список имён файлов, подходящих под шаблон. Чтобы добить имя файла до полного надо обязательно ввести дефис или точку, то есть явным образом выбрать, какой файл нас интересует, и только тогда Tab введёт остаток полностью.
stage-svcname-stderr.log
staging-svcname.stderr.log


То есть достаточно было ввести .../stagi и нажать Tab
Ок, пусть так, невнимательно прочёл имена файлов. Всё равно надо было вручную ввести существенную часть имени. Одно дело — собственная опечатка, другое дело — утверждение, что система автодополнила не на тот файл.
Есть разные варианты. Возможно там авто-дополнение от oh-my-zsh которое позволяет перемещаться по вариантам, даже без ввода начала названия файла. При линуксовом «зоопарке» вариантов очень много. Я бы не делал однозначного утверждения того как работает «линуксовый таб» в той или иной системе, учитывая количество шеллов, терминалов и плагинов к ним.
если в каталоге есть два файла
readme
readme.txt

tab подставит полное имя readme

Но в случае топикстартера, скорее всего он нажал tab, и не глядя все варианты добил e и tab, ибо не знал что кроме stage может быть staging.
Да, конечно, если одно имя полностью совпадает с началом другого, то такое могло быть, но не в случае, описанном автором. Собственно, претензия была не к тому, что человек ошибся при выборе имени (всякое бывает), а к тому, что он обвинил в этом автодополнение.

Но в этом случае автокомплит не вставит пробел после имени файла!

У меня в центоси бывает, что и после единственного варианта не вставляет пробел, а по повторному табу выводит всё тот же единственный подходящий вариант.
Не разбирался, что за глюк; возможно, какие-то автодополняшки друг с другом конфликтуют.

Может у него в .inputrc TAB: menu-complete и Tab он нажал пару раз.

О, а про такую штуку я не знал. Да, тогда могло быть и так.

А может он вообще поменял логику автокомплита и скомпилировал себе свой bash, ага.

Линуксовый таб сильно настраивается, особенно если вы используете zsh, которая через zstyle позволяет сделать с автодополнением практически всё, что вам может придти в голову, включая, к примеру, проигрывание музыки при каждом нажатии tab без ущерба для собственно автодополнения. Аналог TAB: menu-complete у zsh, кстати, по‐умолчанию стоит. Хотя как просто сделать автоподстановку первого же соответствия (аналог Vim с set wildmode=full) по первому же нажатию tab я не нашёл (что не значит, что такого нет), но непросто (т.е. не через zstyle) это всегда можно сделать разными способами. (С set wildmode=full Vim как раз будет имитировать автоподстановку как в cmd.exe.)

Жуть. Для меня этот вид автодополнения всегда был одним из самых главных недостатков виндовой консоли (к счастью, существует clink, который даёт линуксовый стиль дополнений).
Хотя как просто сделать автоподстановку первого же соответствия (аналог 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* не ограничено lsof, есть и другие полезные
# 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)
lsof — ультимативная тулза для реальных извращений.
Я понимаю, что у больших дядей виртуализация, докер, облака — но у реальных (не голливудских) стартапов обычно ничего этого нет. Есть один физический сервер, и в какой-то момент на нём заканчивается место на диске.
Вы втыкаете в сервер новый жёсткий диск, ибо hotplug, и хотите перенести на него, например, раздел /var (который раньше был в разделе /) — желательно, не отправляя сервер в оффлайн на пару часов.
И тут оказывается, что в /var/log/, /var/run/, /var/wtf/ гадит примерно всё.
И вот тут на помощь приходит lsof. Смотрите открытые файлы — правите конфиги — рестартите сервис.
А вот можно список только таких процессов вывести через lsof? Я неосилил флаги, и просто делал lsof | grep 'w' и далее уже вручную смотрел кто и где что на запись держит
Команда lsof помогает в простых случаях и не помогает в сложных. Сложные случаи — это когда файловую систему вроде бы можно отмонтировать, только нельзя.

А причина обычно в том, что какой-то из процессов ядра занял файл. Сваппинг, любой из модулей, использующий device mapper, биндинг, nfs-сервер, iscsi target, само ядро с partition table, loop… Список длинный.
Опция -U позволяет вывести все файлы сокетов домена Unix.
Омг. Так доменные сокеты еще никто не называл. Неужели так сложно перед публикацией дать вычитать перевод специалисту?
НЛО прилетело и опубликовало эту надпись здесь
Вопрос не в странности, а в том, что это устоявшееся выражение, которое используют в книгах. Например в переводе классической книги Стивенса «UNIX: разработка сетевых приложений», или в «Ядре Linux» за авторством Бовет и Чезати.

Почитайте его код, прогоните стрейсом — и вы перестанете получать удовольствие от пользования им

Ну зачем Вы так сразу, иногда лучше ничего не знать про код программы, или просто о нем не думать. Например на виндах я себе плохо представляю работу без TC, но от мыслей, что он на делфях как-то грустно :) В конце концов главное, чтобы программа удовлетворяла потребностям.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий