Kann ich einen bereits gestarteten Prozess nicht starten / überprüfen?

260

Ich führe einige Testläufe von Datenmigrationsskripten mit langer Laufzeit über SSH durch. Angenommen, ich beginne gegen 16 Uhr mit der Ausführung eines Skripts. jetzt rollt 18 uhr herum und ich verfluche mich dafür, dass ich das nicht alles mache screen.

Gibt es eine Möglichkeit, nohupeinen Vorgang "rückwirkend" durchzuführen, oder muss ich meinen Computer die ganze Nacht online lassen? Wenn es nicht möglich ist, einen Prozess anzuhängen screen, den nohupich bereits gestartet habe, warum dann? Hat das etwas mit der Interaktion zwischen Eltern und Kind zu tun? (Ich akzeptiere keine "Nein" -Antwort, die zumindest die Frage nach dem "Warum" nicht beantwortet - sorry;))

ojrac
quelle
4
Ich habe gerade einen interessanten Blog-Beitrag über gesehen disown. blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
ojrac

Antworten:

212

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

verleugnen

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

Ohne Optionen wird jede Jobspezifikation aus der Tabelle der aktiven Jobs entfernt. Wenn die -hOption angegeben ist, wird der Job nicht aus der Tabelle entfernt, sondern markiert, damit SIGHUP nicht an den Job gesendet wird, wenn die Shell ein SIGHUP empfängt. Wenn die Jobspezifikation nicht vorhanden ist und weder die Option -anoch angegeben werden -r, wird der aktuelle Job verwendet. Wenn keine Jobspezifikation angegeben ist, -a bedeutet die Option, dass alle Jobs entfernt oder markiert werden. Die -rOption ohne Jobspec-Argument beschränkt die Ausführung von Jobs.

gharper
quelle
Genial; Ich hatte gehofft, dass so etwas auftauchen würde.
Ojrac
7
Das Leben kann ungerecht sein. gharper und ich haben das ungefähr zur selben Zeit gepostet :)
serverhorror
4
Du bist mein Held
Thomas Dignan
9
disown ist nicht spezifisch für bash. Es ist auch in zsh, ksh93, ...
Phil P
2
Ich fand, dass Sie tatsächlich verwenden müssen, disown %1wenn 1 die Jobspezifikation ist, im Gegensatz zu fg oder bg, wo Sie nur bg 1 serverwatch.com/tutorials/article.php/3935306/…
mltsy
81

Verwenden Sie 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 Blogbeiträge des Autors:

Jonathan Tran
quelle
Ich bleibe bei den eingebauten Werkzeugen (dh veraltet), aber sie sind nicht so flexibel wie Reptyr. +1
ojrac
22

Um einen Prozess von einem bis zu Ihrem aktuellen Tty zu stehlen, können Sie diesen Hack ausprobieren:

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

Es muss neu formatiert werden, um auf die aktuellen Linux / glibc-Versionen zu kompilieren, funktioniert aber immer noch.

Juliano
quelle
1
Außergewöhnlich cool.
Ojrac
16

Wenn ein Prozess gestartet wird, sind STDIN, STDOUT und STDERR mit etwas verbunden . Im Allgemeinen können Sie dies nicht mehr ändern, sobald der Befehl gestartet wurde. In dem Fall, den Sie beschreiben, handelt es sich wahrscheinlich um eine Tty, die mit der SSH-Sitzung verknüpft ist. nohup macht so ziemlich einfach ...

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

Das heißt, setzt STDIN auf / dev / null, STDOUT auf eine Datei und STDERR auf STDOUT. Screen erledigt viel anspruchsvollere Dinge, indem es Ttys einrichtet, die direkt zu sich selbst führen.

Ich kenne keine Möglichkeit, einen laufenden Prozess rückwirkend zu überprüfen oder zu überprüfen. Wenn Sie nach / proc / $ pid / fd cden und sehen, auf was 0, 1 und 2 zeigen.

Sie haben vielleicht etwas Glück mit Disown, aber nicht, wenn der Prozess versucht, etwas mit STDIN, STDOUT oder STDERR zu tun.

freiheit
quelle
2
+1 für die guten Kommentare. st (din | out | err) ist die andere Hälfte des Problems, und ich schätze den Rat, wo ich anfangen soll, wenn ich das nächste Mal in diesem Stau bin.
Ojrac
6
Sie können es tatsächlich auf den meisten Unixen ändern. Es ist ein ekelhafter Hack. Ich liebe es. :) Verbinden Sie sich mit Hilfe der Debug-Unterstützung wie ptrace mit dem Prozess und erzwingen Sie dann, dass der Prozess dup2 () aufruft, um die Verbindung von 0,1,2 zu einem anderen Dateihandle wiederherzustellen.
Zan Lynx
2
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
13

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

TRS-80
quelle
1
Nett! Ich habe versucht, Kryopid in der Dissertation meines Meisters über Prozessmigration zu verwenden, aber es funktionierte nicht immer, egal was ich tat. Am Ende musste ich Dynckpt mit einer alten Version von Linux verwenden. Sind Sie vielleicht an der Entwicklung von Kryopiden beteiligt? Ich sehe, dass Ihr Name der Domain des Autors ähnlich ist.
Juliano
1
Ich bin nicht an der Entwicklung beteiligt, ich kenne nur den Autor von der Universität. Er hat nicht die Zeit cryopid zur Zeit aufrecht zu erhalten, so sieht es aus wie einige Leute arbeiten daran an begann sharesource.org/project/cryopid
TRS-80
12

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

Wie auch immer, hast du es versucht disown(ein bash builtin)

~ $ 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.
Serverhorror
quelle
5

Ich habe kürzlich einen Link zu neercs gesehen , einem bildschirmähnlichen Dienstprogramm, das mit libcaca, einer Farb-ASCII-Kunstbibliothek, erstellt wurde. Unter anderem bietet es die Möglichkeit, einen vorhandenen Prozess zu erfassen und ihn in Ihrer neercs-Sitzung (Bildschirmsitzung) erneut zu erben.

Ich habe es jedoch nicht benutzt und kann daher nicht beurteilen, ob es funktioniert oder nicht.

Daniel Lawson
quelle
2

Ich bin wahrscheinlich der Meinung, dass dies so ist, dass ich mich frei fühlen kann, es zu korrigieren (ich habe bereits etwas über Verleugnung gelernt!). Oder ist das Hauptproblem, bei dem Sie STDOUT immer noch sehen möchten, während es ausgeführt wird?

Chris_K
quelle
1
Das würde den Prozess immer noch beenden, wenn der Besitzer tty stirbt, sodass das OP die Box verlassen muss, in der er den Befehl ausgeführt hat, was er vermeiden möchte
Serverhorror
OK, das kaufe ich. Danke für die Erklärung. Die abgelehnten Vorschläge sehen also viel schlauer aus als meine :-)
Chris_K
1
Sie können dies immer noch tun, kurz nachdem Sie -h abweisen
müssten
2

Wenn Sie damit leben können, dass Sie nicht in der Lage sind, mit dem Prozess zu interagieren, und keine Einwände gegen das Laden zufälliger Kernelmodule haben, können Sie es schlechter machen, als sich Snoop anzuschauen . Alternativ gibt es einige andere Projekte. Hier ist ein Aufruf von injcode, der meistens das tun kann, was Sie tun möchten.

David Pashley
quelle
1

Ich wollte nohup(oder ähnliches) verwenden, um das zu startenlinks Befehlszeilenbrowser und ihn anschließend anzufügen, um eine Datei von der ASP.NET-Website mit einem komplizierten Authentifizierungsprozess und vielen Statusangaben für verborgene Ansichten herunterzuladen, die es schwierig machten, die Aufgabe zu erledigen mit curl/ wget.

Ich habe es schließlich benutzt tmux was die Aufgabe einfach toll gelöst hat:

  1. Lauf tmux
  2. Führen Sie Ihre App aus (links in meinem Fall) und lassen Sie sie laufen
  3. Schließen Sie die SSH-Sitzung. Die App wird weiterhin ausgeführt
  4. Stellen Sie später eine Verbindung mit SSH zu demselben Computer her und führen Sie sie aus tmux attach, um die App wieder auf den Bildschirm zu bringen
Dmitry Gusev
quelle
tmux ist großartig - aber wie nohup oder screen funktioniert es nur, wenn Sie es verwenden, bevor Sie Ihren Prozess starten. Diese Frage bezieht sich auf die Zeiten, in denen Sie feststellen, dass Sie tmux benötigen, nachdem Ihr Prozess bereits ausgeführt wurde.
Ojrac
-1

Sind Sie besorgt über das Zeitlimit für die Sitzung? In diesem Fall können Sie den Prozess mit Strg-Z und BG ausführen und dann etwas einfügen, um die Sitzung am Leben zu erhalten, wie z. B. einen "ping -t localhost" oder "top".

Wenn Sie sich abmelden möchten, kann ich leider keine weiteren Kommentare hinzufügen.

TrojanName
quelle
Es ist die Abmeldesache.
Ojrac
1
Eine andere Möglichkeit, das Trennen zu stoppen, besteht darin, nach oben zu laufen. DAS mischt immer ein paar Bytes herum.
Rory