初めてターミナルを開いたり、しばらく使用しなかった後に新しいターミナルを開くと、ホームディレクトリ内のすべての種類のタブの完成(たとえば、ls
およびTab)に数秒かかります。以前にマウントされたネットワークドライブを使用したときにこの動作を見たことがありますが、これは何もautofs
起こりません~/
。 systemdの自動マウントを使用してNFS共有をマウントしましたが、これが存在するため、~/badabing/
すべて~/
自体はローカルファイルです。
自動マウントの問題の場合、関連行は/etc/fstab
次のようになります(たとえば、サーバーは「バダビング」と呼ばれ、数年前にSopranosの暴食中に名前が付けられました)。
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
それから~/badabing
私は以下を持っています:
$ 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
この問題をさらに調査したいと思います。何とかタブを完了できますかstrace
?echo
何が中断されているかを確認するために、さまざまなbash完了スクリプトにコマンドを追加する唯一の方法ですか?そんな場合が多すぎて避けた方がいいと思います。
それでは、この問題の原因は何ですか?それとも、少なくともどのようにさらにデバッグできますか?
答え1
私はそうします:
sudo strace -pXXXX -tfo /tmp/strace.log
どこXXXXbashのプロセスID。 NFS マウントディレクトリツリーの 1 つでファイル名の完成をすばやく確認する場合は正常に動作します。
-f
現在追跡されているプロセスの fork(2) システムコールの結果として生成されたサブプロセスを追跡します。
-t
追跡された各行の前に時間を付けます。
いくつかは以下を好むかもしれません-r
。
-r
システムコールが入力されるたびに相対タイムスタンプを印刷します。これは、連続したシステムコールの開始間の時間差を記録します。
答え2
set -x
完了フレームワークによって実行されたコマンドを含むすべてのシェルコマンドのトレースを取得するには、実行します。
strace -f -p 1234
システムコールの兆候を表示するには、別のシェルで実行してください。 「ジョブが許可されていません」というエラーが表示された場合は、ptrace
トレースプロセスの子プロセスへのシステムコールを制限するセキュリティ制限が原因である可能性があります。この制限を無効にするには、sysctl kernel.yama.ptrace_scope=0
root として実行します。バラよりhttps://askubuntu.com/questions/41629/after-upgrade-gdb-wont-attach-to-processより多くの情報を知りたいです。strace -T -f -o strace.bash bash
あるいは、-T
各システムコールにかかる時間を追加してシェルを起動し、そこで実験することもできます。
1 この制限は、お客様のアカウントで実行される悪意のあるアプリケーションの影響を制限します。これは、いくつかの異なる制限(通常はSELinuxまたはAppArmorを介して適用されます)と組み合わせて、特に制限されたプロセスを小さなファイルセットに制限する場合にのみ機能します。制限されたptraceモードでも、ptraceの一般的なユースケース(つまり、子プロセスをデバッグするデバッガ)はまだ許可されています。
答え3
おそらくこれが役に立ちます:
PS4='Line ${LINENO}: ' bash -x /usr/share/bash-completion/bash_completion ls