我可以取消/筛选已经开始的进程吗?


260

我正在通过SSH对长时间运行的数据迁移脚本进行一些测试。假设我在下午4点左右开始运行脚本;现在,下午6点滚动,而我正在诅咒自己不这样做screen

有什么办法可以“追溯” nohup一个过程,或者我需要整夜将计算机保持在线状态吗?如果无法附加screennohup已经开始的进程,为什么?与父母/子女的处理方式如何互动有关?(我不会接受至少不解决“为什么”的问题的“否”答案-抱歉;))


4
刚刚看到有关的有趣的博客文章disownblogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
ojrac 2011年

Answers:


212

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

舍弃

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

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


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

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

4
您是我的英雄
托马斯·迪格南2010年

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

2
我发现,你确实有使用disown %1,如果1是JOBSPEC,不像FG或BG,你只用bg 1 serverwatch.com/tutorials/article.php/3935306/...
mltsy

81

使用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.)

作者的几篇博客文章:


我将坚持使用内置工具(例如,disown),但是它不如reptyr灵活。+1
ojrac's


16

当进程开始时,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进行任何操作,则不会。


2
+1为好评论。st(din | out | err)是问题的另一半,下次我陷入困境时,我很欣赏从哪里开始寻找的建议。
ojrac

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

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

13

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


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

1
我不参与开发,我只认识大学的作者。他目前没有时间维护冷冻机,所以似乎有人在sharesource.org/project/cryopid
TRS-80 2009年

12

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

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


5

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

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


2

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


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

好,我去买。感谢您的解释。因此,disown -h建议看上去比我的聪明得多:-)
Chris_K 2009年

1
在您不得不
放弃

2

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



1

我想使用nohup(或类似方法)启动links命令行浏览器,并在从ASP.NET网站下载文件后将其附加,该过程具有复杂的身份验证过程和许多隐藏的视图状态,这使得使用它变得困难。用curl/ wget

我最终使用tmux最终解决了这一难题:

  1. tmux
  2. 运行您的应用程序(links以我为例)并使其运行
  3. 关闭SSH会话,该应用将继续运行
  4. 稍后使用SSH连接到同一台计算机,然后运行tmux attach以使应用回到屏幕

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

-1

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

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


这是注销的事情。
ojrac

1
阻止它断开连接的另一种方法是运行顶部。这些总是拖拖拉拉几个字节。
罗里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.