题 我可以nohup /屏幕已经启动的进程吗?


我正在通过SSH进行长时间运行的数据迁移脚本的一些测试运行。假设我在下午4点左右开始运行脚本;现在,下午6点左右,我诅咒自己没有全力以赴 screen

有没有办法“追溯” nohup 一个过程,还是我需要让我的电脑整夜在线?如果无法附加 screen 至/nohup 我已经开始的过程,为什么?与父/子过程如何相互作用有关? (我不接受一个“不”的答案,至少没有解决'为什么'的问题 - 对不起;))


247
2018-06-11 22:53




刚刚看到一篇有趣的博文 disown。 blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the - ojrac


答案:


如果你正在使用Bash,你可以运行 disown -h job

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

如果没有选项,则会从活动作业表中删除每个jobspec。   如果 -h 选项,工作   没有从表中删除,但是   标记为不发送SIGHUP   如果shell收到一个   SIGHUP。如果jobspec不存在,和   不是 -a 也不 -r 选项是   提供,使用当前的工作。如果   没有提供jobspec, -a   选项意味着删除或标记所有   工作;该 -r 选项没有   jobspec参数限制操作   跑步工作。


200
2018-06-11 23:03



真棒;我希望这样的事情能够出现。 - ojrac
生活可能是不公平的。 gharper和我在大约同一时间发布这个:) - serverhorror
你是我的英雄 - Thomas Dignan
disown不是特定于bash。它也在zsh,ksh93,... - Phil P
我发现你实际上必须使用 disown %1 如果1是jobspec,不像你刚才使用的fg或bg bg 1  serverwatch.com/tutorials/article.php/3935306/... - mltsy


使用 reptyr

来自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.)

其作者的一些博客文章:


77
2018-05-22 21:27



我将坚持使用内置工具(即disown),但它不像reptyr那样灵活。 +1 - ojrac


要从一个tty到你当前的tty窃取进程,你可能想尝试这个hack:

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

它需要一些重新格式化才能编译成当前的Linux / glibc版本,但仍然有效。


22
2018-06-12 05:38



特别酷。 - ojrac


进程启动时,STDIN,STDOUT和STDERR连接到 某物。通常,一旦命令启动,您就无法更改它。在您描述的情况下,这可能与ssh会话相关联。 nohup几乎就是......

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

也就是说,将STDIN设置为/ dev / null,将STDOUT设置为文件,将STDERR设置为STDOUT。 Screen做了更复杂的事情,涉及设置直接指向自身的ttys。

我不知道有任何办法追溯nohup或屏蔽正在运行的进程。如果你cd到/ proc / $ pid / fd并看看0,1和2指向什么。

你可能会对disown有一些好运,但如果进程试图对STDIN,STDOUT或STDERR做任何事情,那就不行了。


16
2018-06-11 23:04



好的评论+1。 st(din | out | err)是问题的另一半,我很欣赏有关从哪里开始寻找的建议,下次我遇到这个问题。 - ojrac
你实际上可以在大多数Unix上改变它。这是一个恶心的黑客。我喜欢它。 :)你做的是,使用像ptrace这样的调试支持连接到进程,然后强制进程调用dup2()将0,1,2重新连接到另一个文件句柄。 - Zan Lynx
是的,你可以改变它。涉及暂停进程(SIGSTOP),并修改fd 0,1,2的文件描述符。然后重新启动(SIGCONT)。 - Michael Martinez


Cryopid 是grab.c的作者的进一步发展,它将一个进程冻结到一个文件,然后你运行(在屏幕内)恢复进程。


12
2018-06-14 18:26



太好了!我试图在我的硕士论文中使用cryopid关于进程迁移,但无论我做了什么,它都无法一直工作。最后,我不得不使用dynckpt与古老版本的Linux。您是否参与了cryopid的开发?我看到你的名字与作者的域名相似。 - Juliano
我没有参与开发,我只是从大学了解作者。他目前没有时间保持低温,所以看起来有些人开始研究它 sharesource.org/project/cryopid - TRS-80


我只能给你一个简单的“不”而没有屏幕部分的原因,我会对你自己感兴趣。

不过你试过吗? 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.

11
2018-06-11 23:02





Solaris / OpenSolaris上的nohup有一个-p标志,用于nohup正在运行的进程 - 例如,请参阅 Solaris 10 nohup手册页


9
2018-06-13 00:59





我最近看到了一个链接 neercs,这是一个使用libcaca(一个彩色ascii-art库)构建的类似屏幕的实用程序。除了其他功能之外,它还拥有抓取现有流程并在neercs(屏幕)会话中重新使用它的能力。

我没有用它,所以我无法评论它是否有效。


5
2018-06-14 21:03