【问题标题】:How to detach a process from terminal in unix?如何在unix中从终端分离进程?
【发布时间】:2012-08-04 10:04:42
【问题描述】:

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

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

【问题讨论】:

  • 你为什么不先尝试一下呢?在后台启动一个进程,注销并再次登录并检查ps该进程是否仍然存在`
  • 这让我觉得这是一个有趣且有用的问题,如下。我怀疑通过终端启动的进程将在终端被杀死时被杀死。老实说,这对我来说听起来像是一个分叉,但我不知道,我从来不需要调用一个分叉。
  • 如果您注销或以其他方式丢失会话,则进程将被终止,除非您使用nohup 命令:) 但不确定是否可以在新会话中恢复进程
  • 查找命令dtachtmuxscreen

标签: unix


【解决方案1】:

您要查找的命令已被拒绝。

disown <processid>

这与 nohup 最接近。它将进程与当前登录分离并允许它继续运行。谢谢大卫科恩!

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

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

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

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

【讨论】:

    【解决方案2】:

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

    在重新捕获 stdout/stdin 方面,将进程作为守护进程启动或使用 nohup 可能无法满足您的所有需求。

    网上有很多例子。在google上试试,“unix screen command”和“unix screen tutorial”:

    【讨论】:

      【解决方案3】:

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

      请参阅 daemon(3) 手册页以获取简短概述。守护进程的主要内容 在没有退出或阻止任何事情的情况下进入后台。的列表 流程可以做些什么来实现这一点:

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

      如果作为 root 进程启动,您还想做您需要成为 root 的事情 首先,然后删除权限。也就是将有效用户改为“守护进程” 使用 setuid()/setgid() 的用户或“无人”。如果您不能放弃所有特权并需要 root 权限有时,在不需要时使用 seteuid() 临时删除它。

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

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

      【讨论】:

      • 我想的差不多。如果/当我需要编写一个守护进程时,我确信我将不得不自己去 google/stackoverflow 所有这些废话。
      【解决方案4】:

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

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

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

      nohup 命令告诉 shell 启动程序,并以这种 HUP 信号被忽略的方式执行此操作。即调用终端退出后程序继续运行。

      您仍然可以通过发送信号与该程序进行交互(再次参见kill(1)),但这是一种非常有限的交互方式,并且取决于您编写的程序在接收到这些信号(信号USR1USR2 是有用的陷阱,如果你喜欢那种东西)。或者,您可以通过命名管道、信号量或其他进程间通信 (IPC) 进行交互。这很快就会变得很繁琐。

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

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

      【讨论】:

        猜你喜欢
        • 2018-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        • 2012-10-19
        • 2022-06-15
        • 1970-01-01
        相关资源
        最近更新 更多