Conclusão de tabulação trava

2

Quando eu abro um terminal pela primeira vez, ou abro um novo depois de não ter usado um por algum tempo, qualquer tipo de conclusão de tabulação no meu diretório pessoal (por exemplo, ls e Tab ) leva vários segundos. Eu já vi esse comportamento antes ao usar autofs para montar unidades de rede, mas não tenho nenhum em ~/ . Eu montei compartilhamentos NFS com o automount do systemd, mas eles estão em ~/badabing/ , então tudo em ~/ em si é apenas um arquivo local.

Caso seja um problema de montagem automática, aqui estão as% relevantes/etc/fstab lines (sim, o servidor é chamado de "badabing", eu o nomeei durante uma farra dos Sopranos há alguns anos):

badabing:/nfs_shares/music /mnt/badabing/music    nfs4  noauto,x-systemd.automount,x-systemd.device-timeout=5sec,x-systemd.idle-timeout=1min    0 0
badabing:/nfs_shares/series /mnt/badabing/series  nfs4  noauto,x-systemd.automount,x-systemd.device-timeout=5sec,x-systemd.idle-timeout=1min    0 0
badabing:/nfs_shares/movies /mnt/badabing/movies  nfs4  noauto,x-systemd.automount,x-systemd.device-timeout=5sec,x-systemd.idle-timeout=1min    0 0

Em seguida, em ~/badabing , tenho:

$ ls -l ~/badabing/
total 0
lrwxrwxrwx 1 terdon terdon 32 Jan 10  2016 movies -> /mnt/badabing/nfs_shares/movies/
lrwxrwxrwx 1 terdon terdon 31 Jan 10  2016 music -> /mnt/badabing/nfs_shares/music/
lrwxrwxrwx 1 terdon terdon 31 Jan 10  2016 series -> /mnt/badabing/nfs_shares/series

Eu gostaria de investigar mais isso. Eu posso de alguma forma strace concluir a tabulação? É a única maneira de adicionar echo comandos nos vários scripts de conclusão bash para ver o que está pendurado? Existem alguns deles, então eu prefiro evitar isso.

Então, o que está causando isso ou, pelo menos, como posso depurá-lo ainda mais?

    
por terdon 19.11.2016 / 13:22

3 respostas

3

Eu faria isso:

sudo strace -pXXXX -tfo /tmp/strace.log

em que XXXX é o ID do processo do bash. Em uma verificação rápida da conclusão do nome do arquivo em uma das minhas árvores de diretório montadas pelo NFS, ele funciona sem problemas:

-f

Trace child processes as they are created by currently traced processes as a result of the fork(2) system call.

-t

Prefix each line of the trace with the time of day.

Algumas pessoas podem preferir -r :

-r

Print a relative timestamp upon entry to each system call. This records the time difference between the beginning of successive system calls.

    
por 19.11.2016 / 16:18
2

Execute set -x para obter um rastreamento de cada comando do shell, mesmo aqueles executados pelo framework de conclusão.

Execute strace -f -p 1234 de outro shell para ver um rastreamento de chamadas do sistema. Se você receber o erro "Operação não permitida", pode ser devido a uma restrição de segurança que restringe a chamada do sistema ptrace aos filhos do processo de rastreamento.¹ Para desabilitar essa restrição, execute sysctl kernel.yama.ptrace_scope=0 como root. Consulte o link para obter mais informações. Como alternativa, você ainda pode iniciar um shell com strace -T -f -o strace.bash bash ( -T adiciona o tempo gasto em cada chamada do sistema) e fazer seus experimentos a partir dele.

¹ Esta restrição limita o impacto da execução de um aplicativo mal-intencionado em sua conta. Só é eficaz se associado a muitas outras restrições (normalmente efetuadas com o SELinux ou AppArmor), em particular para limitar o processo restrito a um pequeno conjunto de arquivos. Mesmo no modo ptrace restrito, o caso de uso típico para ptrace, que é para um depurador depurar um processo filho, permanece permitido.

    
por 20.11.2016 / 00:33
1

Talvez isso ajude:

PS4='Line ${LINENO}: ' bash -x /usr/share/bash-completion/bash_completion ls
    
por 19.11.2016 / 16:19