Dlaczego `ls` bez żadnych argumentów (tylko flagi) nie daje mi„ takiego pliku lub katalogu ”?

5

Kiedy przechodzę --color=alwaysdo ls, czasami wyświetla szereg No such file or directorybłędów, takich jak ten:

~/svn/projects/submm/adda/scat$ /bin/ls --color=always
ls: cannot access adda_output_f89: No such file or directory
ls: cannot access adda_output_f150: No such file or directory
ls: cannot access adda_output_f183: No such file or directory
ls: cannot access adda_output_f186: No such file or directory
ls: cannot access adda_output_f190: No such file or directory
...

Później postępuj zgodnie z zawartością katalogu, w tym podkatalogiem adda_output_f89pokolorowanym jako katalog.

Jest uruchomiony proces, który działa na plikach w tym katalogu, ale nie sądzę, aby działał na wspomnianych katalogach ls.

Nie jest to w pełni powtarzalne. Do tej pory nie udało mi się znaleźć wzoru, kiedy to się dzieje, a kiedy nie. Wydaje się, że dzieje się to falami. Być może proces szybko tworzy i usuwa katalogi, ale nie sądzę, że to prawda.

Wydaje się, że dzieje się to tylko wtedy, gdy zdam --color=always, ale nie jestem w 100% pewien, że tak jest. Zwykle używam aliasu, w ls='ls --classify --color=always --human-readable'którym tak się dzieje, ale kiedy dzwonię /bin/ls, wydaje się, że tak się nie dzieje.

Edytuj :

ls -i daje dla tych plików:

? adda_output1_f243/  ? adda_output_f243/

itp.

Edytuj :

To jest system plików NFS.

Co może powodować takie zachowanie? Czy to jakiś warunek wyścigu?

gerrit
źródło
Czy na pewno błąd występuje tylko podczas używania --color=always? Czy jesteś pewien, że zawsze używasz /bin/lsaliasu?
terdon
Zwykle używam ls, co jest dla mnie pseudonimem ls --classify --color=always --human-readable. Nie dzieje się tak, gdy używam czystego /bin/lslub /bin/ls --classify. Nie wypróbowałem wszystkich kombinacji opcji.
gerrit
Co dzieje się z "ls" --color=always?
przemawiający
@speakr Niestety nie udało mi się jeszcze znaleźć sposobu na wiarygodne odtworzenie problemu, a teraz w ogóle się nie dzieje ... Zaktualizuję, jeśli problem powróci.
gerrit
2
@gerrit: Znajduje nazwę katalogu przy użyciu jakiegoś rodzaju readdir. Następnie próbuje statuzyskać informacje w katalogu, ale katalog nagle nie istnieje.
choroba

Odpowiedzi:

1

Jak wspomniano w komentarzach, lsw montażu NFS powstają dwa osobne wywołania NFS, z niewielkim opóźnieniem między nimi. Jeśli podejrzewasz, że jakiś proces może polegać na dodawaniu i usuwaniu wpisów w katalogu, zdecydowanie skorzystam z tego jako wyjaśnienia. Oto jak przetestowałbym tę teorię.

Jeśli problem występuje kilka razy po uruchomieniu ls(tj. Odtworzenie go byłoby możliwe ręcznie, uruchamiając lswiele razy), możesz po prostu:

{ ls;ls;ls; } 2>&1 | tee ls.out | grep 'No such file'

Uruchom ponownie to polecenie, aż ls.outpojawi się błąd, a następnie sprawdź plik, znajdź pliki, na które się skarżył, a następnie sprawdź, czy te pliki 1) istnieją w pierwszej 1/3 wyniku, a 2) nie istnieją w ostatnie 1/3 wyniku. Ponieważ pliki zostały (prawdopodobnie) usunięte podczas lsuruchamiania jednego z poleceń, nie powinno być trudno ustalić, czy były tam wcześniej, a potem zostały usunięte.

Jeśli reprodukcja zajmuje dużo czasu, możesz napisać skrypt w stylu (nieprzetestowane!):

#!/bin/bash

while /bin/true; do
  /bin/ls -lc >ls1.out 2>&1
  /bin/ls -lc >ls2.out 2>&1
  /bin/ls -lc >ls3.out 2>&1
  grep 'No such file' ls2.out >missing.out 2>&1
  if (( $? != 0 )); then
    echo "Found the error!"
    break
  fi
done

(Dodaj sleeps, jeśli martwisz się wpływem wydajności na działanie w nieokiełznanej ciasnej pętli).

Uruchom to w screensesji i sprawdź później. Gdy skrypt zakończy pracę, zgłaszając, że znalazł błąd, sprawdź, missing.outktóre pliki lsnie mogły znaleźć, a następnie sprawdź, czy pliki te są wymienione, ls1.outale nie ls3.out.

Nie zapomnij zweryfikować zgłoszonego czasu ls, na wypadek, gdyby ten tajemniczy proces spowodował usunięcie pliku, a następnie utwórz nowy plik o tej samej nazwie w samą porę, aby trzeci lsmógł go wyświetlić. :)

Jeśli okaże się, że z jakiegoś powodu przyczyną nie jest to, że proces usunął plik podczas lsdziałania, zgłoś to tutaj, a my dowiemy się, co jeszcze można spróbować.

Isaac Freeman
źródło