如何在unix中从终端分离进程?

时间:2012-08-04 10:04:42

标签: unix

当我在终端中启动后台进程时,如果终端如何关闭,那么我们就无法再与该进程交互了。我不确定,但我认为这个过程也会被杀死。任何人都可以告诉我如何从终端分离该过程。所以,即使我关闭终端,我也可以在新终端中与相同的进程进行交互?

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

4 个答案:

答案 0 :(得分:13)

您正在寻找的命令已被取消。

disown <processid>

这就像你可以获得一个nohup一样接近。它将进程与当前登录分离,并允许它继续运行。谢谢David Korn!

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

我刚刚找到了reptyr,它可以让你重新发现一个不相关的进程。 https://github.com/nelhage/reptyr

它已经在ubuntu的包中了。

但是如果你还没有开始这个过程而且你计划将来再这样做,那么前进的方法是screentmux。我更喜欢screen

答案 1 :(得分:5)

您可能还会考虑screen命令。它具有“恢复我的会话”功能。不可否认,我从未使用它,忘了它。

在重新捕获stdout / stdin方面,以守护进程或nohup启动进程可能无法完成所需的一切。

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

答案 2 :(得分:4)

“UNIX妖魔化进程”的第一个google结果:

有关简短概述,请参阅守护程序(3)联机帮助页。守护进程的主要内容 在没有退出或举起任何东西的情况下进入后台。的列表 一个过程可以做到的事情:

  • fork()
  • setsid()
  • 将stdin / stdout / stderr关闭/重定向到/ dev / null,和/或忽略SIGHUP / SIGPIPE。
  • chdir()到/.

如果以root进程身份启动,您还需要执行root所需的操作 首先,然后删除权限。也就是说,将有效用户更改为“守护进程” user或“nobody”与setuid()/ setgid()。如果你不能放弃所有特权和需要 root访问有时,使用seteuid()在不需要时暂时删除它。

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

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

答案 3 :(得分:0)

'与'互动'可能意味着一些事情。

在终端结束时,命令行启动的程序退出的原因是,shell退出时会向该进程发送HUP信号(请参阅kill(1)的文档以获取一些介绍;顺便说一句,HUP是“挂机”的缩写,最初表示用户已经挂断了调制解调器/电话。对HUP信号的默认响应是进程终止 - 也就是说,调用的程序退出。

细节稍微繁琐,但这是一般的直觉。

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

您仍然可以通过发送信号与此程序进行交互(请再次参阅kill(1)),但这是一种非常有限的交互,并且取决于您收到这些信号时编写的程序是否做了明智的事情(信号USR1USR2是陷阱的有用信息,如果你遇到那种事情的话。或者,您可以通过命名管道或信号量或其他进程间通信(IPC)进行交互。那很快就会变得非常繁琐。

我怀疑你所追求的是能够将终端重新连接到该过程。这是一个相当复杂的过程,像screen这样的应用程序在幕后做了相当复杂的事情来实现这一点。

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