我正在通过SSH对长时间运行的数据迁移脚本进行一些测试。假设我在下午4点左右开始运行脚本;现在,下午6点滚动,而我正在诅咒自己未在screen中执行所有操作。整晚?如果无法将nohup附加到/ screen已经启动的进程,那为什么呢?与父母/子女的处理方式如何互动有关? (我不会接受至少不解决“为什么”的问题的“否”答案-抱歉;)))

评论

刚刚看到了一篇有关Disown的有趣博客文章。 blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the

#1 楼

如果您使用的是Bash,则可以运行disown -h job


disown

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


如果没有选项,则会从
如果指定了-h选项,则不会从表中删除该作业
,而是对其进行标记
,以便在以下情况下不将SIGHUP发送给该作业:
外壳收到
SIGHUP。如果不存在jobspec,并且没有提供
-a-r选项,则使用当前作业。如果
没有提供作业规范,则-a
选项意味着删除或标记所有
作业;不带
jobspec参数的-r选项将操作
限制为正在运行的作业。


评论


太棒了我希望这样的事情会出现。

– ojrac
09年6月12日,0:13

生活可能不公平。我和gharper大约在同一时间发布了此内容:)

–马丁M.
09年6月12日在7:02

你是我的英雄

–托马斯·迪格南(Thomas Dignan)
2010年7月9日在1:42

拒绝并非专门针对bash。它也在zsh,ksh93等中...

– Phil P
2011年1月17日上午10:18

我发现如果1是工作规范,您实际上必须使用disown%1,这与fg或bg不同,在fg或bg中,您仅使用bg 1serverwatch.com/tutorials/article.php/3935306/…

– mltsy
13年4月9日在17:21

#2 楼

在自述文件中使用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.)


作者的一些博客文章:


reptyr:将正在运行的进程附加到新终端上
reptyr:更改进程的控制终端上


评论


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

– ojrac
2011年5月23日15:19

#3 楼

要窃取从一个tty到您当前tty的进程,您可能想尝试一下这种方法: />
需要一些重新格式化才能编译到当前的Linux / glibc版本,但仍然可以使用。

评论


非常酷。

– ojrac
2009年6月12日14:35

#4 楼

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

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


即将STDIN设置为/ dev / null,将STDOUT设置为文件,将STDERR设置为STDOUT。 Screen要做很多复杂的事情,包括设置直接指向自己的ttys。

我不知道有什么方法可以追溯nohup或筛选正在运行的进程。如果您使用CD到/ proc / $ pid / fd并查看0、1和2指向什么。

您可能会感到不满意,但如果该进程尝试使用STDIN进行任何操作,则不然, STDOUT或STDERR。

评论


+1为好评论。 st(din | out | err)是问题的另一半,当我下次遇到这种情况时,我很欣赏从哪里开始寻找的建议。

– ojrac
09年12月12日在3:25

实际上,您可以在大多数Unix上更改它。这是令人作呕的骇客。我喜欢它。 :)您要做的是,使用调试支持(如ptrace)连接到该进程,然后强制该进程调用dup2()将0,1,2重新连接到另一个文件句柄。

–赞·山猫
09年6月16日在20:07

是的,您可以更改它。涉及暂停进程(SIGSTOP),并修改fd 0、1、2的文件描述符,然后重新启动(SIGCONT)。

–迈克尔·马丁内斯(Michael Martinez)
13-10-16在0:53

#5 楼

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

但是您尝试过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.


#6 楼

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

评论


真好!我在硕士论文中尝试使用cryopid进行进程迁移,但是无论我做什么,它始终无法正常工作。最后,我必须在旧版本的Linux上使用dynckpt。您可能参与了低温的发展吗?我发现您的姓名与作者的网域相似。

–朱利亚诺
09年6月14日在18:43

我不参与开发,我只认识大学的作者。他目前没有时间维护冷冻机,所以看起来有些人开始在sharesource.org/project/cryopid上进行此工作。

– TRS-80
09年6月14日在19:10

#7 楼

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

#8 楼

我最近看到了neercs的链接,这是一个使用libcaca(一种彩色ascii艺术库)构建的类似于屏幕的实用程序。除其他功能外,它还具有抓取现有流程并在您的neercs(屏幕)会话中重新父代化的功能。

但是我没有使用过,因此无法评论它是否有效或不。

#9 楼

我可能对此不太了解,因此可以随时纠正我(我已经学习了disown!)... ctrl-Z和“ bg”至少不能使进程在后台运行吗?还是您仍然希望在STDOUT运行时看到它的关键问题?

评论


当拥有者tty死亡时,这仍然会终止进程,因此OP需要离开命令执行命令的框,这是他想要避免的事情

–马丁M.
09年6月11日在23:11

好,我买。感谢您的解释。因此,disown -h建议看起来比我的聪明得多:-)

– Chris_K
09年6月11日在23:15

在您不得不放弃-h之后,您仍然可以执行此操作:stackoverflow.com/a/625436/705198

– AndrewPK
2012年1月26日20:47



#10 楼

如果您可以忍受无法与进程交互,并且不反对加载随机内核模块,那么您可能会比看Snoop更糟。另外,还有几个其他项目。这是一个调用injcode,它几乎可以完成您想做的事情。

#11 楼

您可以使用gdb将进程输出重定向到文件中。

https://blog-en.openalfa.com/how-to-detach-from-the-terminal-a-running-process-in-linux

,然后将其删除

更新:我必须在sudo和gdb命令在Ubuntu 18.04中稍微不同的情况下运行gdb:

p (int)dup2(open("/tmp/test.stdout", 1), 1)

评论


大量使用GDB,谢谢!

– ojrac
19年4月4日在0:58

#12 楼

我想使用nohup(或类似的软件)启动links命令行浏览器,并从ASP.NET网站下载文件后附加它,该文件具有复杂的身份验证过程和很多隐藏的视图状态,这使它很难使用。我最终用curl结束了工作,结果很好地解决了工作:


运行wget

运行您的应用程序(在我的情况下为tmux)并使其保持运行状态
关闭SSH会话,该应用程序将继续运行。 />

评论


tmux很棒-但是,像nohup或screen一样,它只有在开始处理之前使用它时才有效。这个问题是关于您在进程已经运行之后意识到需要tmux的时候。

– ojrac
17年8月18日在16:57

#13 楼

您是否担心会话超时?在这种情况下,您可以Ctrl-z和bg进程,然后放一些东西以使会话保持活动状态,例如“ ping -t localhost”或“ top”。

如果您要注销,那么恐怕无法添加其他注释。

评论


这是注销的事情。

– ojrac
09年6月12日,0:10

阻止它断开连接的另一种方法是运行顶部。这些总是拖拖拉拉几个字节。

–罗里
09年8月4日在22:55