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

  • 本文关键字:终端 分离 进程 unix unix
  • 更新时间 :
  • 英文 :


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

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

您要查找的命令是disown。

disown <processid>

这是最接近nohup的地方。它将进程与当前登录分离,并允许它继续运行。谢谢David Korn!

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

我刚刚发现了爬行动物,它可以让你修复一个被否认的过程。https://github.com/nelhage/reptyr

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

但是,如果你还没有开始这个过程,并且你计划在未来这样做,那么接下来的路就是屏幕和tmux。我更喜欢屏幕。

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

从重新捕获stdout/stdin的角度来看,以守护进程或nohup启动进程可能无法完成您想要的一切。

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

  • http://www.thegeekstuff.com/2010/07/screen-command-examples/
  • GNU屏幕:入门和初学者教程

"UNIX妖魔化进程"的第一个谷歌结果:

请参阅守护进程(3)手册页以获取简短概述。守护程序的主要内容正在进入后台而不退出或举起任何东西。列表一个过程可以做的事情来实现这一点:

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

如果从根进程开始,您还想做一些需要成为根进程的事情首先,然后放弃特权。也就是说,将有效用户更改为"守护进程"user或带有setuid()/setgid()的"nobody"。如果你不能放弃所有特权和需要root访问有时,在不需要时使用seteuid()临时删除它。

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

下面是一个关于创建Unix守护程序的HOWTO:http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html

"与交互"可能意味着几件事。

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

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

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

您仍然可以通过向该程序发送信号来与它进行交互(再次参见kill(1)),但这是一种非常有限的交互,并且取决于您的程序在收到这些信号时会做一些合理的事情(如果您喜欢这类事情,信号USR1USR2是有用的陷阱)。或者,您可以通过命名管道、信号量或进程间通信(IPC)的其他部分进行交互。这很快就会变得棘手。

不过,我怀疑你想要的是能够将终端重新连接到进程中。这是一个相当复杂的过程,像screen这样的应用程序在幕后做一些适当复杂的事情来实现这一点。

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

最新更新