Welche Risiken birgt das Stoppen und Wiederaufnehmen von Prozessen in Linux?

587
haroba

Angenommen, ich stoppe die Verwendung eines Prozesses Ctrl+Zund setze ihn fünf Stunden später fort fg. Wie riskant ist dies im Hinblick auf das reibungslose Funktionieren des Prozesses?

Stellen Sie sich zum Beispiel vor, dass daran gearbeitet vimwird, eine große Datei auf die Festplatte zu schreiben, und dass ich sie während des Schreibvorgangs stoppe. Wird vimdie Datei ohne Probleme fertig geschrieben, wenn ich sie wiederaufnehme? Was passiert im Extremfall, wenn ich die Datei inzwischen gelöscht habe? Kann ich das Dateisystem beschädigen? (Ist vimes überhaupt möglich, eine Datei zu löschen, in die der gestoppte Server geschrieben hat, oder werden die Dateisystemtreiber mich daran hindern, die Datei zu löschen, bis der vimSchreibvorgang abgeschlossen ist?)

vimist offensichtlich eine relativ einfache Software, die "nur" ein Texteditor ist. Kann ich komplexe Softwareprogramme anhalten und wieder aufnehmen, z. B. apacheoder X11ohne zu viele Probleme zu erwarten (abgesehen von Client-Zeitüberschreitungen bei Apache)?

1

3 Antworten auf die Frage

6
Geoff Gustafson

Im Wesentlichen ist Strg-Z keine gefährliche Sache. Sie sollten keine Angst davor haben.

Was genau passiert, hängt davon ab, was der Prozess macht. Ihre Beispiele sind gute Beispiele.

Die erste, mit vim Schreiben einer Datei ... wird nichts Schlimmes passieren. Wenn nach dem Fortsetzen von vim noch Speicherplatz übrig ist, wird das Schreiben der Datei beendet. Wenn Sie vim töten, während es angehalten ist, wird die Datei mit so vielen Daten abgeschnitten, wie vor dem Anhalten geschrieben wurden (sofern Sie dies trotzdem tun müssen). Wenn Sie die Datei löschen, während vim angehalten ist, wird vim die Datei so lange sehen, wie sie benötigt wird. Von außerhalb von vim wird die Datei als gelöscht angesehen, aber vim wird sie immer noch sehen, bis sie mit dem Schreiben fertig ist, und schließt sie. Danach verschwindet sie. (Wenn vim versucht, es dann wieder zu öffnen, ist es weg.) Nachdem Sie sich an das letzte Verhalten gewöhnt haben, haben Sie das Gefühl, ein albernes Spielzeug zu verwenden, wenn Windows Dateien sperrt.

Ihr zweites Beispiel könnte Probleme verursachen. Wenn andere Prozesse mit Ihren interagieren, werden sie alle ein wenig auf diese App warten. Ja, es kommt zu Client-Zeitüberschreitungen. Einige Prozesse werden möglicherweise unbegrenzt auf das Lesen von Daten usw. blockiert. Dennoch passiert nichts wirklich "Schlechtes". Nichts sollte das System beschädigen, es sei denn, irgendwo ist ein Fehler aufgetreten. (Zum Beispiel gibt eine schlecht geschriebene App, die das Zeitlimit nicht verarbeiten kann, auf und verliert alle Daten ... aber das ist nicht die Schuld der App, die Sie angehalten haben.)

Apache würde offensichtlich keine Webseiten mehr anbieten. X11 würde aufhören, Pixel zu verschieben. Wenn Sie es jedoch erneut starten, werden Dinge, die blockiert wurden, wieder aufgenommen. Wenn die Zeitüberschreitung der Clients überschritten ist, funktionieren sie auch wieder, wenn Sie sie neu starten.

1
Cristian Ciupitu

Unix ist ein Time-Sharing-Betriebssystem, so dass Programme ohnehin keinen exklusiven Zugriff auf die CPU erhalten, sondern sie mit anderen Programmen und dem Betriebssystem selbst gemeinsam nutzen. Wenn Sie ein Programm aussetzen, verzögern Sie nur die Zeit bis zum nächsten Ausführungszeitraum. Je nach Programm, z. B. wenn es zeitabhängig ist, z. B. bei Netzwerk- oder Videowiedergabesoftware, kann es zu Timeouts kommen. Grundsätzlich passiert jedoch nichts Schlimmes.

Zur zweiten Frage zum Löschen einer Datei, während das Programm noch läuft, siehe Frage "Wann entfernt rm offene Dateien?" .

-1
Luis Colorado

Grundsätzlich kommt es auf das Programm an. Mit vim (1) (oder mit vi (1) ) können Sie es sogar töten, so dass Sie die Möglichkeit haben, die Datei bis zum Moment des Abbruchs wiederherzustellen, ohne Daten zu verlieren, selbst wenn das gesamte System abgestürzt ist (siehe unter) die vi (1) / vim (1) manpage)

Im Allgemeinen kann das Stoppen eines Programms für fünf Stunden einige seitliche Auswirkungen haben, die das, was Sie tun, beschädigen.

Angenommen, das Programm, das Sie geöffnet haben, ist ein Netzwerkclient (z. B. eine ssh (1) -Sitzung auf einem anderen Computer). Normalerweise aktivieren Server eine TCP-Option namens SO_KEEPALIVE, die es erlaubt, die Verbindung aufrecht zu erhalten, auch wenn Sie nichts zu sagen haben. In diesem Fall schadet es nicht, da der Kernel, der über eine offene TCP-Verbindung verfügt, KEEPALIVE für den angehaltenen Prozess vornimmt (TCP-Verbindungen sind Kernelressourcen und keine Userland-Prozessressourcen), und Sie können den Prozess unbegrenzt aufrechterhalten.

Was passiert jedoch, wenn der Server versucht, Daten zu senden, und der Client dies nicht bestätigt? Möglicherweise hat das Anwendungsprotokoll eine Zeitüberschreitung, um eine Verbindung abzubrechen, wenn der Client über einen längeren Zeitraum nichts sagt (oder der Server den gesamten Datenpuffer zum Client füllt und nicht blockieren kann). In diesem Fall erhalten Sie einen Client, der versucht, eine Verbindung zu verwenden, die vor einiger Zeit unterbrochen wurde (der Server ging weg).

Die Antwort auf diese Frage lautet also: Im Allgemeinen kein Problem, aber es hängt genau davon ab, was das Programm aufgrund seiner Umgebung angehalten hat (es schläft, aber die Welt dreht sich weiter).