Es verhält sich unter Stress anders


7

Ich weiß nicht, wie ich diese Situation debuggen soll:

1) Ich versuche auszuführen:

ls /home/user

2) ls blockiert und druckt nichts. Ich gehe davon aus, dass / home / user / home / user / sshfs_files enthält, ein von sshfs gemountetes Verzeichnis, aber das Netzwerk ist auf meinem Computer ausgefallen (das Netzwerk ist wieder aktiv, aber ich denke, die SSH-Verbindung wurde unterbrochen).

3) Da ich sicher sein wollte, dass das von sshfs gemountete Verzeichnis die Ursache für dieses Auflegen war, versuchte ich den gleichen Befehl unter strace:

strace -o /tmp/log ls /home/user

4) Und das ls hat tatsächlich funktioniert! Jetzt ist die Situation so, dass ls unter Zwang arbeitet, aber von selbst blockiert.

Wie ist das überhaupt möglich? Wie kann man diese Situation erklären? Wie kann ich sehen, wo ls blockieren, wenn es nicht unter Zwang blockiert?

Vielen Dank!


Wie wäre es ls /home/user | cat? Dies könnte einfach lserkennen, wie seine Ausgabe behandelt wird ...
rozcietrzewiacz

2
Beachten Sie, dass dies sinnvoll wäre, da die Ausgabe von ls(bei typischen Setups) farbig ist. Das Färben ist nur dann erwünscht, wenn die Ausgabe nicht umgeleitet wird, da sonst die Escape-Sequenzen die Ausgabe durcheinander bringen würden. Und um die Ausgabe farbenfroh zu gestalten, lsmuss der Typ jedes Eintrags festgelegt werden. An diesem Punkt hängt es mit Ihrem sshs_filesVerzeichnis.
Rozcietrzewiacz

1
@rozcietrzewiacz: Sie sollten Ihrem Kommentar eine Antwort geben, damit user5528 ihn akzeptieren kann. Nicht akzeptierte Fragen geben Ihnen ein schlechtes Karma.
Benutzer unbekannt

1
Da der Kommentar von @ rozcietrzewiacz korrekt war, ist dies ein nahezu genaues Duplikat dieser Frage . Hier gilt zumindest die dort akzeptierte Antwort.
jw013

1
@ jw013 Richtig. Nahe, aber nicht genau: Der Titel kann für andere Menschen mit ähnlichen Problemen einen Unterschied machen. Also ... Dieser wird vielleicht irgendwann geschlossen, aber da ich dazu aufgefordert werde, werde ich eine Antwort posten.
Rozcietrzewiacz

Antworten:


5

Wie jw13 hervorhob , ist dies fast ein genaues Duplikat von "Es dauert lange in einem kleinen Verzeichnis " - zumindest was die Erklärung betrifft. Lesen Sie auch dort die Kommentare!

Kurz gesagt, einige gängige Befehlszeilenprogramme wie lskönnen anders funktionieren, wenn ihre Ausgabe nicht direkt an ein Terminal geht. In diesem Fall, lsder wahrscheinlich auf Alias ​​ausgerichtet ist, ls --color=autowird versucht, den Typ jedes Verzeichniseintrags zu Farbzwecken zu ermitteln. An seinem Punkt hängt es und kann keine statOperation für Ihr sshfs-gemountetes Verzeichnis ausführen .

Hinzufügen zu MadScientists Antwort auf die erwähnte Frage : Wenn Sie neugierig sind, wie straceoder gdbbeim Debuggen lsdes Verhaltens helfen kann , schlage ich vor, dass Sie so etwas ausführen

 strace -o /tmp/log ls --color=always /home/user

0

Nun, das ist ein häufiges Verhalten für Programme, die unter Debugging stehen und nicht wirklich vermeidbar sind. Die Initialisierung von Variablen ändert sich, es stehen weitere Informationen zur Verfügung, der Programmablauf wird geändert.

Entweder erhalten Sie die Quelle von ls und führen sie durch einen anderen Debugger, in der Hoffnung, dass der Fehler angezeigt wird, oder Sie versuchen, eine Antwort zu finden, eine Problemumgehung auf andere Weise.


Ich habe es mit gdb versucht und ls hat auch nicht blockiert
user368507

@ user5528: Vielleicht müssen Sie also experimentieren: Was passiert, wenn die SSH-Verbindung nicht verloren geht? Können Sie ls [^s]*zum Beispiel das sshfs-Verzeichnis filtern ? Was ergibt sich find ~ maxdepth -1 -ls?
Benutzer unbekannt

Problem in den Kommentaren zum ursprünglichen Beitrag gelöst. danke
user368507

Ein Debugger ändert die Initialisierung von Variablen nicht. Es kann den Zeitpunkt der Ausführung auf subtile Weise ändern, da bestimmte Teile des Programms verlangsamt werden. Dies kann das Verhalten der Rennbedingungen und anderer besonders heimtückischer Fehler ändern, ändert jedoch nichts an der Initialisierung.
Psusi

1
Ein Debugger kann die Initialisierung definitiv ändern, wenn die Variablen nicht im Code initialisiert werden. Sie werden in einem Debugger auf 0 initialisiert und im Release-Modus auf alles initialisiert, was sich im Speicher befindet.
Étienne
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.