Frage Kann ich einen bereits gestarteten Prozess nohup / screenen?


Ich mache einige Testläufe lang laufender Datenmigrationsskripte über SSH. Lassen Sie uns sagen, dass ich gegen 16 Uhr ein Skript starte. jetzt, 6 Uhr rollt herum, und ich verfluche mich selbst, weil ich das alles nicht gemacht habe screen.

Gibt es einen Weg "rückwirkend" nohup ein Prozess, oder muss ich meinen Computer die ganze Nacht online lassen? Wenn es nicht möglich ist, anzuhängen screen zu/nohup ein Prozess, den ich bereits begonnen habe, warum? Etwas damit zu tun, wie Eltern / Kind-Prozesse interagieren? (Ich werde keine "Nein" -Antwort akzeptieren, die nicht zumindest die Frage nach dem "Warum" behandelt - Entschuldigung;))


247
2018-06-11 22:53


Ursprung


Ich habe gerade einen interessanten Blogeintrag gesehen disown. blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the - ojrac


Antworten:


Wenn Sie Bash verwenden, können Sie ausführen disown -h job

verleugnen

disown [-ar] [-h] [jobspec ...]

Ohne Optionen wird jede Jobspec aus der Tabelle der aktiven Jobs entfernt.   Wenn die -h Option ist gegeben, der Job   wird nicht aus der Tabelle entfernt, aber ist   markiert, damit SIGHUP nicht gesendet wird   der Job, wenn die Shell eine erhält   SEUFZEND. Wenn jobspec nicht vorhanden ist und   weder die -a Noch -r Option ist   geliefert, wird der aktuelle Job verwendet. Ob   es wird keine jobspec geliefert, der -a   Option bedeutet, alle zu entfernen oder zu markieren   Arbeitsplätze; das -r Option ohne a   Jobspec-Argument beschränkt die Operation   zu laufenden Jobs.


200
2018-06-11 23:03



Genial; Ich hatte gehofft, dass so etwas auftauchen würde. - ojrac
Das Leben kann unfair sein. gharper und ich posten das ungefähr zur gleichen Zeit :) - serverhorror
Sie sind mein Held - Thomas Dignan
Verweigerung ist nicht spezifisch für bash. Es ist auch in zsh, ksh93, ... - Phil P
Ich habe festgestellt, dass du tatsächlich verwenden musst disown %1 Wenn 1 der Jobspec ist, im Gegensatz zu fg oder bg, wo Sie gerade verwenden bg 1  serverwatch.com/tutorials/article.php/3935306/... - mltsy


Benutzen Reptyr

Aus der README:

reptyr - A tool for "re-ptying" programs.
-----------------------------------------

reptyr is a utility for taking an existing running program and
attaching it to a new terminal. Started a long-running process over
ssh, but have to leave and don't want to interrupt it? Just start a
screen, use reptyr to grab it, and then kill the ssh session and head
on home.

USAGE
-----

  reptyr PID

"reptyr PID" will grab the process with id PID and attach it to your
current terminal.

After attaching, the process will take input from and write output to
the new terminal, including ^C and ^Z. (Unfortunately, if you
background it, you will still have to run "bg" or "fg" in the old
terminal. This is likely impossible to fix in a reasonable way without
patching your shell.)

Ein paar Blogposts des Autors:


77
2018-05-22 21:27



Ich bleibe bei den eingebauten Tools (d. H. Entledigen), aber es ist nicht so flexibel wie der Reptyr. +1 - ojrac


Um einen Prozess von einem tty zu Ihrem aktuellen tty zu stehlen, sollten Sie diesen hack versuchen:

http://www.ucc.asn.au/~dagobah/things/grab.c

Es benötigt einige Neuformatierung, um auf aktuelle Linux / Glibc-Versionen zu kompilieren, funktioniert aber immer noch.


22
2018-06-12 05:38



Außergewöhnlich cool. - ojrac


Wenn ein Prozess startet, sind STDIN, STDOUT und STDERR verbunden etwas. Im Allgemeinen können Sie das nicht ändern, sobald der Befehl gestartet wurde. In dem Fall, dass du beschreibst, ist das wahrscheinlich ein Teil der SSH-Sitzung. Nohup tut so ziemlich genau ...

command < /dev/null > nohup.out 2>&1

Das heißt, setzt STDIN zu / dev / null, STDOUT zu einer Datei und STDERR zu STDOUT. Der Bildschirm macht viel ausgefeiltere Dinge, die das Einrichten von Bildern betreffen, die auf sich selbst gerichtet sind.

Ich kenne keine Möglichkeit, einen laufenden Prozess rückwirkend zu notieren oder zu überwachen. Wenn du nach / proc / $ pid / fd cdst und siehst, auf was 0, 1 und 2 zeigen.

Sie könnten etwas Glück mit dem Verweigern haben, aber nicht, wenn der Prozess versucht, irgendetwas mit STDIN, STDOUT oder STDERR zu tun.


16
2018-06-11 23:04



+1 für die guten Kommentare. st (din | out | err) ist die andere Hälfte des Problems, und ich schätze die Ratschläge, wo ich anfangen soll, das nächste Mal, wenn ich in diesem Stau bin. - ojrac
Sie können es tatsächlich auf den meisten Unixen ändern. Es ist ein ekelhafter Hack. Ich liebe es. :) Was Sie tun, ist, verbinden Sie sich mit dem Prozess mit Debug-Unterstützung wie ptrace, dann erzwingen Sie den Prozess zu dup2 (), um 0,1,2 zu einem anderen Dateihandle wieder zu verbinden. - Zan Lynx
Ja, du kannst es ändern. Beinhaltet das Anhalten des Prozesses (SIGSTOP) und das Ändern der Dateideskriptoren für fd 0, 1, 2. Anschließend Neustart (SIGCONT). - Michael Martinez


Kryopid ist eine Weiterentwicklung des Autors von grab.c, der einen Prozess in eine Datei einfriert, die Sie dann (innerhalb des Bildschirms) ausführen, um den Prozess fortzusetzen.


12
2018-06-14 18:26



Nett! Ich habe versucht, Cryopid in meiner Masterarbeit über Prozessmigration zu verwenden, aber es hat nicht immer funktioniert, egal was ich getan habe. Am Ende musste ich dynckpt mit einer alten Version von Linux benutzen. Sind Sie vielleicht an der Entwicklung von Cryopiden beteiligt? Ich sehe, dass Ihr Name der Domäne des Autors ähnelt. - Juliano
Ich bin nicht in die Entwicklung involviert, ich kenne den Autor nur von der Universität. Er hat im Moment keine Zeit, Kryopid zu halten, also sieht es so aus, als hätten einige Leute angefangen, daran zu arbeiten sharesource.org/project/cryopid - TRS-80


Ich kann dir nur ein einfaches "Nein" geben ohne das Warum für den Bildschirmteil, ich würde mich für den Grund interessieren.

Wie auch immer, hast du es versucht disown (Ein Bash eingebaut)

~ $ echo $SHELL
/bin/bash
~ $ type disown
disown is a shell builtin
~ $ help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.

11
2018-06-11 23:02





nohup unter Solaris / OpenSolaris hat ein Flag -p, um einen laufenden Prozess anzuhalten - siehe zum Beispiel Solaris 10 nohup man-Seite.


9
2018-06-13 00:59





Ich habe kürzlich einen Link zu ... gesehen neercsDies ist ein bildschirmähnliches Dienstprogramm, das mit libcaca, einer Farb-ASCII-Kunstbibliothek, erstellt wurde. Unter anderem bietet es die Möglichkeit, einen vorhandenen Prozess zu greifen und ihn in Ihrer neercs (Bildschirm) -Sitzung wiederzuerlangen.

Ich habe es jedoch nicht benutzt, daher kann ich nicht sagen, ob es funktioniert oder nicht.


5
2018-06-14 21:03





Vermutlich denke ich, dass es so leicht ist, mich zu korrigieren (ich habe schon von Verweigerung erfahren!) ... Würden ein Ctrl-Z und "bg" nicht zumindest dafür sorgen, dass der Prozess im Hintergrund läuft? Oder ist das Hauptproblem, dass Sie STDOUT während der Ausführung sehen möchten?


2
2018-06-11 23:08



Das würde den Prozess immer noch beenden, wenn der Besitzer stirbt, so dass der OP die Box verlassen muss, in der er den Befehl ausgeführt hat, was er vermeiden will - serverhorror
OK, ich werde das kaufen. Danke für die Erklärung. Die Verweigerungs-Vorschläge sehen also viel klüger aus als meine :-) - Chris_K
Du könntest das immer noch machen, kurz nachdem du verleugnen müsstest -h: stackoverflow.com/a/625436/705198 - AndrewPK


Wenn Sie damit leben können, dass Sie nicht in der Lage sind, mit dem Prozess zu interagieren, und nichts dagegen haben, zufällige Kernel-Module zu laden, könnten Sie es schlimmer machen als sich anzuschauen Schnüffeln. Alternativ gibt es ein paar andere Projekte. Hier ist ein Anruf injcode, der meistens tun kann, was Sie tun möchten.


2
2018-06-11 23:35





Ich wollte benutzen nohup (oder ähnlich) um das zu starten links Befehlszeilen-Browser und nach dem Download eine Datei von der ASP.NET-Website mit einem komplizierten Authentifizierungsvorgang und eine Menge von versteckten Ansicht Zustand, die es schwierig gemacht, die Arbeit mit machen, um es zu verbinden curl/wget.

Ich habe schließlich benutzt tmux was den Job einfach großartig gelöst hat:

  1. Lauf tmux
  2. Führen Sie Ihre App aus (links in meinem Fall) und lass es laufen
  3. Schließen Sie die SSH-Sitzung, die App wird weiterhin ausgeführt
  4. Verbinden Sie sich später mit SSH mit derselben Maschine und führen Sie sie aus tmux attach um die App zurück auf den Bildschirm zu bringen

1
2017-08-17 16:18



tmux ist großartig - aber wie Nohup oder Bildschirm funktioniert es nur, wenn Sie es vor dem Start Ihres Prozesses verwenden. Diese Frage bezieht sich auf die Zeiten, in denen Sie feststellen, dass Sie tmux benötigen, nachdem Ihr Prozess bereits läuft. - ojrac