lsを実行すると、なぜこのファイルが非表示になるのですか?


10

編集:私はこのスレッドを完全に忘れていました。ハードディスクに問題があったことがわかりました。他のニーズのためにこのサーバーを再展開する必要があったので、ようやく1つの不良ディスクの交換に取り掛かり、ビジネスに復帰しました。

数週間前から、この1つの特定のファイルを削除できなかった理由がわかりませんでした。rootとしてはできますが、シェルスクリプトは別のユーザーとして実行されます。だから私はls -laを実行しますが、そこにはありません。ただし、パラメーターとして呼び出すと表示されます。案の定、所有者はrootであるため、削除できません。

6535が欠落していることに注意してください...

[root@server]# ls -la 653*
-rw-rw-r--  1 svn svn  24002 Mar 26 01:00 653
-rw-rw-r--  1 svn svn   7114 Mar 26 01:01 6530
-rw-rw-r--  1 svn svn   8653 Mar 26 01:01 6531
-rw-rw-r--  1 svn svn   6836 Mar 26 01:01 6532
-rw-rw-r--  1 svn svn   3308 Mar 26 01:01 6533
-rw-rw-r--  1 svn svn   3918 Mar 26 01:01 6534
-rw-rw-r--  1 svn svn   3237 Mar 26 01:01 6536
-rw-rw-r--  1 svn svn   3195 Mar 26 01:01 6537
-rw-rw-r--  1 svn svn  27725 Mar 26 01:01 6538
-rw-rw-r--  1 svn svn 263473 Mar 26 01:01 6539

直接呼び出すと表示されます。

[root@server]# ls -la 6535
-rw-rw-r--  1 root root 3486 Mar 26 01:01 6535

ここに面白いものがあります。6535はrootが所有しているため、シェルスクリプトで削除に失敗するため、この問題を見つけました。「rm -rf」を実行すると、実際にファイルが表示されます。以前に試してみましたが、ディレクトリが空ではないことが通知されたため、ディレクトリを削除できませんでした。中に入って見てみると、ファイル「6535」がようやく表示されました。なぜこれが行われているのかわかりません。

straceは次のように述べています

#strace ls -la 653* 2>&1 | grep ^open

open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib64/tls/librt.so.1", O_RDONLY) = 3
open("/lib64/libacl.so.1", O_RDONLY)    = 3
open("/lib64/libselinux.so.1", O_RDONLY) = 3
open("/lib64/tls/libc.so.6", O_RDONLY)  = 3
open("/lib64/tls/libpthread.so.0", O_RDONLY) = 3
open("/lib64/libattr.so.1", O_RDONLY)   = 3
open("/etc/selinux/config", O_RDONLY)   = 3
open("/proc/mounts", O_RDONLY)          = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/proc/filesystems", O_RDONLY)     = 3
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
open("/usr/share/locale/en_US.UTF-8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.utf8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/nsswitch.conf", O_RDONLY)    = 3
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib64/libnss_files.so.2", O_RDONLY) = 3
open("/etc/passwd", O_RDONLY)           = 3
open("/etc/group", O_RDONLY)            = 3
open("/etc/mtab", O_RDONLY)             = 3
open("/proc/meminfo", O_RDONLY)         = 3
open("/etc/localtime", O_RDONLY)        = 3

2
これを理解した場合は、アップデートを投稿してください。
einstiien

面白い。ls -abで何が報告されますか?たぶん、ファイル名に8進数以外の奇妙な文字が含まれていますか?-aはとにかくそれをリストするだろうと思いますが、私にはわかりません。
egorgry

1
最近fsckを実行しましたか?ファイルシステムで何かが壊れている可能性があります。
Zoredache 2010年

明日もう一度テストして、その日に出発します。
ラッキータクシー

回答:


7

それは少し心配です。ls既知の正常なファイルと比較して、ファイルが変更されていないことを確認します。ディストリビューションのパッケージツールを使用して、隔離されたシステムでファイルを確認できます。


+1:ls -alはすべてを表示します。そうでない場合は、どこかに問題があります。
Satanicpuppy 2010年

2
それはそれはかなり可能ですls、特定のPIDを隠すように変更されている可能性が6535.
MikeyB

いいえ...何もありません
luckytaxi

6

時々、ファイル名はカーソル移動シーケンスのような奇妙な文字をそれらに含みます。これを確認してください:

ls -lq

制御文字の代わりに疑問符が表示されるはずです(これはおそらくデフォルトですが、そうでない可能性があります)。

これは、存在する可能性のある問題のタイプを部分的に示しています。

touch A C
touch B$(tput cuu1)$'\r'
ls -l
ls -lq
ls -l --show-control-chars    # for systems that have that option and default to -q

私も試してみます:

type -a ls
alias ls
declare -f ls
md5sum /bin/ls    # compare to a known-good identical system

エイリアスまたは関数が定義されているかどうか、またはバイナリが奇妙な場所にあるか、変更されているかどうかを確認します。


1
良い洞察力+1。ls変更された場合md5sum、システムのも変更された可能性があることに注意することが重要です。確定的な結論に到達するために検証するための既知の正常な環境が必要です。
ワーナー

md5を変更して偽の結果を生成したとしても、 'md5 file'のようなことをすると、bzip2 <file | md5とそれを他の場所の同じコマンドと比較ます。
クリス


2

「ls」が変更されたと思う場合、私は通常このようなことをします...

python -c "import os; print os.listdir('.')"

もちろん、Python、Cライブラリ、カーネル、またはファイルシステムを変更することできますが、通常は単なるシェルユーティリティです。


2
または、シェルのファイル名展開を使用してディレクトリを読み取ることができます-echo *(そして、すべてが必要な場合は、echo *。*)
chris

*.*では、文字の後にドットが続き、その後に文字のあるファイルのみが表示されます。これは* nixシステムのすべてではありません。echoがすべてを1つのコマンドで表示するかどうかはecho * && echo .*
わかり

4
よく見ると、これは*(スペース)。*であり、*。*ではありません。句読点は、このコメントシステムの強力なスーツではありません。あなたはそれを養うことを気にします。&&はブール値あり、echoコマンドが常に成功するため常に機能するため、ブール値の&&は必要ありません。
クリス

@chris:私の悪い、それを見るのは本当に難しい。
einstiien 2010年

2

straceを使用すると、lsの動作を正確に調べることができます。これにより、そのファイル名が表示されない理由がわかります。

strace ls -la 653* 2>&1 | less

それを通してそれを見て、何が起こっているのかを見てください。

strace ls -la 653* 2>&1 | grep ^open

出力は次のようになります。

open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/librt.so.1", O_RDONLY)       = 3
open("/lib/libacl.so.1", O_RDONLY)      = 3
open("/lib/libselinux.so.1", O_RDONLY)  = 3
open("/lib/libc.so.6", O_RDONLY)        = 3
open("/lib/libpthread.so.0", O_RDONLY)  = 3
open("/lib/libattr.so.1", O_RDONLY)     = 3
open("/lib/libdl.so.2", O_RDONLY)       = 3
open("/lib/libsepol.so.1", O_RDONLY)    = 3
open("/etc/selinux/config", O_RDONLY|O_LARGEFILE) = 3
open("/proc/mounts", O_RDONLY|O_LARGEFILE) = 3
open("/selinux/mls", O_RDONLY|O_LARGEFILE) = 3

そしてあなたが何かのようなものを見た場合

open("/var/tmp/.../H@ckl1st", O_RDONLY) = 3

注意してください、あなたは0wnedされています...

これは決定的なテストではありませんが、良い指標です...

(solarisまたは他のOSを使用している場合は、straceの代わりにtrussまたは他の同様のユーティリティを使用する必要がある場合があります)

(csh / tcsh派生シェルを使用している場合は、おそらく異なるリダイレクトステートメントが必要になります)


私はこれが好き。straceユーティリティは、実際にスイスアーミーナイフです。あなたはシステムコールレベルに直接入り、恣意的な複雑さの山全体をバイパスします。これは、システム管理者が最初に行うことの1つです。新しくインストールされたマシンにダンプする必要があります。
McJeff

ええ-システム管理者にとって最も価値のある2つのツールはtruss / straceとtcpdumpです。これらを使用すると、カバーの下を常に見て、何かが期待どおりに動作しているかどうかにかかわらず、wtfが進行していることを確認できます。
クリス

2

クイックアップデート。他の理由でサーバーを交換する必要がありました。それはファイルシステムでした。すべてが順調です!!! みんなありがとう。


あなたはファイルシステムが台無しにされていて、これがただの奇妙な症状だったということですか?
クリス

うんそれだった。
ラッキータクシー

他の賛成された(そしてトラブルシューティングに役立つ)回答の下に埋め込まれているので、おそらく以下のリストに解決策があると言うために編集を続けている可能性があります。
Bart Silverstrim

0

ハック理論は興味深いですが、私には別の理論があります。Unixのファイル削除セマンティクスは、すべてのプロセスがそれを指す開いているファイルハンドルを閉じるまで、ファイルを保持します。おそらく、誰かがSVNチェックアウト/コミットを一時停止したか、サーバースレッドがハングアップした可能性があります。SVNプロセス(またはApache)を再起動すると問題が解決する場合は、ここで非難します。

おそらく、このファイルをまだ使用しているプロセスを特定できますlsof | grep 6535か?


いやlsofは何も表示されませんでした。興味深いのは、6535もソースに「欠落」していることです。私のスクリプトは、元のリポジトリを別のディレクトリにホットコピーします。そのため、なんらかの理由でこの特定のファイルを削除できないという問題が発生しました。
ラッキータクシー

削除されたが開いているファイルが含まれているディレクトリを削除することはできません。そのディレクトリエントリが削除されると、そのディレクトリエントリは存在しないため、ディレクトリなります。開いているプロセスが強制終了されるまで、ファイルからスペースを取り戻すことはできませんが、そのファイルが含まれていたディレクトリは削除できます。
chris

あなたの代替理論は興味深いです。削除が成功すると、ハードリンクがすぐに削除されます。iノードにはまだデータが含まれている可能性が高く、一部のファイルハンドルではメモリにキャッシュされている可能性がありますが、このシナリオで説明されている動作を説明できるとは思いません。または、クリスが言ったこと、ヘー。
ワーナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.