6

当我在终端的后台启动一个进程时,如果终端关闭,我们将无法再与该进程交互。我不确定,但我认为进程也会被杀死。谁能告诉我如何将该进程从我的终端中分离出来。因此,即使我关闭终端,我也可以在新终端中与相同的进程进行交互?

我是 unix 新手,所以您的额外信息将对我有所帮助。

4

4 回答 4

13

您正在寻找的命令是不承认的。

disown <processid>

这是尽可能接近 nohup 的方法。它将进程与当前登录分离并允许它继续运行。谢谢大卫科恩!

http://www2.research.att.com/~gsf/man/man1/disown.html

我刚刚找到了 reptyr,它可以让你重新处理一个不承认的进程。 https://github.com/nelhage/reptyr

它已经在 ubuntu 的软件包中了。

但是,如果您还没有开始这个过程并且您计划在未来这样做,那么要走的路就是screentmux。我更喜欢屏幕

于 2013-05-22T07:06:57.563 回答
6

您也可以考虑该screen命令。它具有“恢复我的会话”功能。诚然,我从未使用过它,并且忘记了它。

将进程作为守护进程启动,或者nohup在重新捕获标准输出/标准输入方面可能无法完成您想要的一切。

网上有很多例子。在谷歌上尝试,“unix 屏幕命令”和“unix 屏幕教程”:

于 2012-08-04T10:34:45.590 回答
4

“UNIX恶魔化进程”的第一个谷歌结果:

有关简短概述,请参见 daemon(3) 联机帮助页。守护进程的主要内容是在不退出或阻止任何事情的情况下进入后台。一个进程可以做的事情的列表来实现这一点:

  • 叉()
  • 设置ID()
  • 关闭/重定向 stdin/stdout/stderr 到 /dev/null,和/或忽略 SIGHUP/SIGPIPE。
  • chdir() 到 /。

如果作为 root 进程启动,您还想先做您需要成为 root 的事情,然后再删除权限。也就是说,使用 setuid()/setgid() 将有效用户更改为“daemon”用户或“nobody”。如果您无法删除所有权限并且有时需要 root 访问权限,请在不需要时使用 seteuid() 临时删除它。

如果您要分叉一个守护程序,那么还要设置子处理程序,如果调用 exec,请在您的孩子不需要的所有文件描述符上设置 close on exec 标志。

这是关于创建 Unix 守护进程的 HOWTO:http: //www.netzmafia.de/skripten/unix/linux-daemon-howto.html

于 2012-08-04T10:14:29.590 回答
0

“互动”可能意味着几件事。

从命令行启动的程序在终端结束时退出的原因是,shell 在退出时会向该进程发送 HUP 信号(kill(1)有关一些介绍,请参阅文档;顺便说一下,HUP 很短用于“挂断”,最初表示用户已挂断调制解调器/电话)。对 HUP 信号的默认响应是进程终止——即被调用的程序退出。

细节稍微复杂一些,但这是一般的直觉。

nohup命令告诉外壳程序启动程序,并以忽略此 HUP 信号的方式执行此操作。也就是说,程序在调用终端退出后继续运行。

您仍然可以通过向它发送信号来与该程序进行交互(kill(1)再次查看),但这是一种非常有限的交互方式,并且取决于您的程序被编写为在接收到这些信号时执行明智的事情(信号USR1USR2有用的事情可以捕获,如果你喜欢那种事情)。或者,您可以通过命名管道、信号量或其他进程间通信 (IPC) 进行交互。这很快就会变得很繁琐。

不过,我怀疑您所追求的是能够将终端重新连接到该进程。这是一个相当复杂的过程,并且应用程序喜欢screen在幕后做适当复杂的事情来实现这一点。

nohup事情是一种快速而肮脏的守护进程。该daemon(3)函数“正确”地执行守护进程,按照 YePhIcK 的回答中所述进行各种整理,以全面断开与调用它的进程/终端的链接。您可以使用与上述相同的 IPC 工具与该守护进程交互,但不能直接使用终端。

于 2013-05-22T17:06:39.937 回答