Warum fixiert strace / truss manchmal steckende Prozesse?

1254
Emmel

Manchmal haben Sie einen steckengebliebenen Prozess, der seit einiger Zeit festgefahren ist, und sobald Sie mit strace / truss darauf stoßen, nur um zu sehen, was los ist, wird er auf magische Weise gelöst und läuft weiter! Durch das bloße "Beobachten" haben diese Programme einen gewissen Einfluss auf die Ausführung der steckengebliebenen Programme. Was passiert hier? Hat strace (ich schätze über ptrace (2)?) Ein Signal gesendet, wodurch das Programm aufhört zu blockieren oder so?

Ich habe dies mehrmals gesehen - zuletzt unter Linux RHEL 4 (und einem Perl-Skript, das mit Prozessen muckt und in diesem Fall einige Netzwerk-IOs ausführt), aber auch in einigen anderen Zusammenhängen. Leider kann ich das nicht reproduzieren, da es mal passiert ... in Krisenzeiten. Aber meine Neugier bleibt bestehen. :-)

Jede Erklärung wird geschätzt.

4

1 Antwort auf die Frage

0
Vi.

May be it is a bug either in kernel or in program you are tracing?

The program may have incorrectly implemented event loop that is waits for wrong thigs, but waits for other things after EINTR.

Example:

for(;;) { select(...); if(FD_SET(...i...)) { read(...i...); write(...j...); // Naive blocking write } } 

It will work in trivial test, but the whole program may block if any write blocks.

Suspending/resuming the program aborts blocking write and causes the main loop to continue.