Заполнение клавишей Tab Bash, кажется, читает ненужную информацию о файловой системе?

Предположим, что у меня есть клиент NFS с долей NFS, смонтированной в/nfs_share.

Предположим, что я отключаю сервер NFS, вызывая неизящное завершение работы.

Теперь/nfs_share моего клиента является устаревшим.

Если на клиенте я вхожу в подсказку удара и тип ls /nfs_<TAB> затем мой удар окружает замораживания. Это, кажется, застревает в syscall.

Просто чтение / для поиска, какие записи могли бы соответствовать "/nfs _", не должно блокироваться в безразличной файловой системе, поскольку мы читаем записи в / файловая система, не записи в файловой системе NFS, смонтированной в/nfs_share.

Замораживание только произошло бы, если заполнение клавишей Tab заставляет удар (или что-то еще) читать опоры F/S NFS.

Таким образом, я задаюсь вопросом, знает ли кто-либо то, что поражает файловую систему NFS? * И я могу настроить систему, чтобы не попытаться считать свойства смонтированной файловой системы, просто делание строки соответствует, чтобы сделать заполнение клавишей Tab?

Я помню в прошлом (несколько лет назад), возможно, на другом дистрибутиве, поражение устаревшего монтирования NFS генерировало бы сообщение об ошибке и ненулевой код выхода, и быстро в этом.

*) Это поведение мне имеет чувство некоторой части systemd, пытающегося "оптимизировать" вещи информацией о файловой системе с кэшированием Если так, хорошо - но как я могу выключить его?

1
задан 23 April 2020 в 05:41

2 ответа

Завершение в Bash является двухэтапным процессом - некоторые части сделаны ударом, и некоторые сделаны readline. В случае завершения имени файла удар получает список записей каталога и затем передает имена файлов readlink, где мы имеем:

mark-directories
Если установлено на‘on’, завершенным именам каталогов добавили наклонную черту. Значение по умолчанию‘on’.

Readline затем stats имена файлов, чтобы решить, добавить ли наклонную черту. В некоторых системах, с некоторыми файловыми системами, эта информация уже доступна, когда удар получил записи каталога, но это не может всегда иметь место.

В любом случае, быстрая проверка strace -o log bash без и с set mark-directories off в .inputrc шоу это вероятно главная причина.

Без set mark-directories off:

read(0, "\t", 1)                        = 1
openat(AT_FDCWD, "/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_CLOEXEC|O_DIRECTORY) = 3
fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
getdents64(3, /* 20 entries */, 32768)  = 488
getdents64(3, /* 0 entries */, 32768)   = 0
close(3)                                = 0
write(2, "\n", 1)                       = 1
stat64("/bin", {st_mode=S_IFDIR|0755, st_size=53248, ...}) = 0
stat64("/bin", {st_mode=S_IFDIR|0755, st_size=53248, ...}) = 0
stat64("/boot", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat64("/boot", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
write(2, "bin/  boot/ \n", 13)          = 13
write(2, "bash-5.0$ ls /b", 15)         = 15

С:

read(0, "\t", 1)                        = 1
openat(AT_FDCWD, "/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_CLOEXEC|O_DIRECTORY) = 3
fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
getdents64(3, /* 20 entries */, 32768)  = 488
getdents64(3, /* 0 entries */, 32768)   = 0
close(3)                                = 0
write(2, "\n", 1)                       = 1
write(2, "bin   boot  \n", 13)          = 13
write(2, "bash-5.0$ ls /b", 15)         = 15
2
ответ дан 25 April 2020 в 10:41

Это происходит из-за способа, которым монтирование NFS обрабатывается клиентом. Рассматриваемого как удаленные соединения и клиент отправит ls запросите к удаленному NFS, размещают и ожидают ответа. Если никакой ответ не получен в течение указанного периода тайм-аута с timeo набор опции или период тайм-аута по умолчанию (60 секунд) иначе, затем клиент повторит запрос NFS снова и таким образом сохранит активное ожидание приглашения оболочки ответа.

Это поведение ожидается как запись для NFS доля существует в Вашем fstab. Это - то, куда завершение прибывает из (так как доля NFS была уже смонтирована), когда Вы нажимаете Tab, и это не имеет никакого соединения, характерного для systemd или bash в этом вопросе.

Это также почему эти опции soft,bg существовать. Попытайтесь использовать их при монтировании NFSдоля на клиенте. Также Вы могли бы хотеть добавить timeo=30 опция как тайм-аут по умолчанию, 600 (60 секунд), таким образом, Вы могли бы хотеть сократить его.

мягкий / трудно

Определяет поведение восстановления клиента NFS после того, как запрос NFS испытает таймаут. Если никакая опция не указана (или если трудная опция указана), запросы NFS повторены неограниченно долго. Если легкий путь указан, то клиент NFS приводит запрос NFS к сбою после того, как retrans повторные передачи были отправлены, заставив клиент NFS возвратить ошибку вызывающему приложению.

bg / fg

Определяет, как монтирование (8) команда ведет себя, если попытка смонтировать экспорт перестала работать. fg причины опции монтируются (8) для выхода с ошибочным состоянием, если какая-либо часть запроса монтирования испытывает таймаут или перестала работать напрямую. Это называют "приоритетным" монтированием и является поведением по умолчанию, если ни fg, ни bg не монтируют, что опция указана.

Посмотрите NFS для больше.

2
ответ дан 25 April 2020 в 10:41

Другие вопросы по тегам:

Похожие вопросы: