Answers:
如果您使用的是Bash,则可以运行 disown -h job
disown [-ar] [-h] [jobspec ...]
如果没有选项,则会从活动作业表中删除每个作业规范。如果指定了该
-h
选项,则不会从表中删除作业,而是对其进行标记,以便如果Shell收到SIGHUP,则不会将SIGHUP发送到该作业。如果不存在jobspec,并且也不提供-a
nor-r
选项,则使用当前作业。如果未提供jobspec,则该-a
选项意味着删除或标记所有作业;-r
没有jobspec参数的选项将操作限制为正在运行的作业。
使用reptyr
从自述文件:
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.)
作者的几篇博客文章:
要将进程从一个tty窃取到当前tty,您可能需要尝试以下技巧:
http://www.ucc.asn.au/~dagobah/things/grab.c
需要重新格式化才能编译到当前的Linux / glibc版本,但仍然可以使用。
当进程开始时,STDIN,STDOUT和STDERR连接到某物。通常,一旦命令启动,您将无法更改它。在您描述的情况下,可能是与ssh会话相关的tty。Nohup几乎只是...
command < /dev/null > nohup.out 2>&1
也就是说,将STDIN设置为/ dev / null,将STDOUT设置为文件,将STDERR设置为STDOUT。Screen要做很多复杂的事情,包括设置直接指向自己的tty。
我不知道有什么方法可以追溯nohup或筛选正在运行的进程。如果您cd到/ proc / $ pid / fd并查看0、1和2指向什么。
您可能不满意,但如果该过程尝试使用STDIN,STDOUT或STDERR进行任何操作,则不会。
我只能给您一个简单的“否”,而没有屏幕部分的原因,我会对自己的原因感兴趣。
但是您是否尝试过disown
(内置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.
Solaris / OpenSolaris上的nohup具有-p标志,用于对正在运行的进程进行nohup-例如,请参见Solaris 10 nohup手册页。
我可能对此不太了解,所以可以随时纠正我(我已经学习了disown!)... ctrl-Z和“ bg”至少不能使进程在后台运行吗?还是您仍然希望在STDOUT运行时看到它的关键问题?
您可以使用gdb将进程输出重定向到文件
https://blog-en.openalfa.com/how-to-detach-from-the-terminal-a-running-process-in-linux
然后将其舍弃
Upd:我必须在sudo中运行gdb,并且在Ubuntu 18.04中使用略有不同的gdb命令:
p (int)dup2(open("/tmp/test.stdout", 1), 1)
我想使用nohup
(或类似方法)启动links
命令行浏览器,并在从ASP.NET网站下载文件后将其附加,该过程具有复杂的身份验证过程和许多隐藏的视图状态,这使得使用它变得困难。用curl
/ wget
。
我最终使用tmux
最终解决了这一难题:
tmux
links
以我为例)并使其运行tmux attach
以使应用回到屏幕
disown
。blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the