it-swarm.cn

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

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

有什么方法可以“追溯” Nohup进程,还是我需要整夜将计算机保持联机状态?如果无法将screen附加到/ Nohup我已经开始的进程,那为什么呢?与父母/子女的处理方式如何互动有关? (我不会接受不会至少解决“为什么”的问题的“否”答案-抱歉;))

262
ojrac

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

不显示

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

如果没有选项,则会从活动作业表中删除每个作业规范。如果给出了-h选项,则不会从表中删除该作业,而是对其进行标记,以便在命令行管理程序收到SIGHUP时不将SIGHUP发送到该作业。如果不存在jobspec,并且-a-r选项均未提供,则使用当前作业。如果未提供jobspec,则-a选项表示删除或标记所有作业;不含jobspec参数的-r选项将操作限制为正在运行的作业。

212
gharper

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

作者的几篇博客文章:

82
Jonathan Tran

要将进程从一个tty窃取到当前tty,您可能需要尝试以下技巧:

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

需要重新格式化才能编译到当前的Linux/glibc版本,但仍然可以使用。

22
Juliano

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

17
freiheit

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

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

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

13
TRS-80

Solaris/OpenSolaris上的Nohup具有-p标志,以使正在运行的进程Nohup-例如,请参见 Solaris 10 Nohup手册页

9
alanc

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

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

5
Daniel Lawson

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

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

然后将其舍弃

Upd:我必须在Ubuntu 18.04中使用Sudo和稍微不同的gdb命令运行gdb:

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

2
d9k

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

2
Chris_K

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

2
David Pashley

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

我最终使用tmux最终解决了问题:

  1. 运行tmux
  2. 运行您的应用(在我的情况下为links)并保持运行
  3. 关闭SSH会话,该应用将继续运行
  4. 稍后使用SSH连接到同一台计算机,然后运行tmux attach将应用重新显示到屏幕上
1
Dmitry Gusev