Lösung 1:
Wenn Sie Bash verwenden, können Sie disown -h job
ausführen
ablehnen
disown [-ar] [-h] [jobspec ...]
Ohne Optionen wird jede Jobspezifikation aus der Tabelle der aktiven Jobs entfernt. Wenn die -h
Wenn die Option angegeben ist, wird der Job nicht aus der Tabelle entfernt, sondern so markiert, dass SIGHUP nicht an den Job gesendet wird, wenn die Shell ein SIGHUP empfängt. Wenn jobspec nicht vorhanden ist, und auch nicht -a
noch -r
Option angegeben ist, wird der aktuelle Job verwendet. Wenn keine Jobspezifikation angegeben wird, wird der -a
Option bedeutet, alle Jobs zu entfernen oder zu markieren; die -r
Die Option ohne das Argument ajobspec beschränkt den Betrieb auf laufende Jobs.
Lösung 2:
Reptyr verwenden
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:
- reptyr:Hängen Sie einen laufenden Prozess an ein neues Terminal an
- reptyr:Ändern des steuernden Terminals eines Prozesses
Lösung 3:
Um einen Prozess von einem tty zu Ihrem aktuellen tty zu stehlen, sollten Sie diesen Hack ausprobieren:
http://www.ucc.asn.au/~dagobah/things/grab.c
Es muss etwas neu formatiert werden, um es in aktuelle Linux/glibc-Versionen zu kompilieren, aber es funktioniert immer noch.
Lösung 4:
Wenn ein Prozess startet, werden STDIN, STDOUT und STDERR mit etwas verbunden . Im Allgemeinen können Sie dies nicht ändern, sobald der Befehl gestartet wurde. In dem von Ihnen beschriebenen Fall hängt das wahrscheinlich mit der ssh-Sitzung zusammen. nohup tut 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 macht viel ausgefeiltere Dinge, einschließlich der Einrichtung von ttys, die auf sich selbst verweisen.
Ich kenne keine Möglichkeit, einen laufenden Prozess rückwirkend zu nohupen oder zu screenen. Wenn Sie nach /proc/$pid/fd wechseln und sehen, worauf 0, 1 und 2 zeigen.
Sie haben vielleicht etwas Glück mit Disown, aber nicht, wenn der Prozess versucht, irgendetwas mit STDIN, STDOUT oder STDERR zu tun.
Lösung 5:
Ich kann Ihnen nur ein einfaches "Nein" ohne das Warum für den Bildschirmteil geben, der Grund würde mich selbst interessieren.
Haben Sie jedoch disown
versucht (eine eingebaute Bash)
~ $ 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.