当我在终端中启动后台进程时,如果终端如何关闭,那么我们就无法再与该进程交互了。我不确定,但我认为这个过程也会被杀死。任何人都可以告诉我如何从终端分离该过程。所以,即使我关闭终端,我也可以在新终端中与相同的进程进行交互?
我是unix的新手,因此您的额外信息将对我有所帮助。
答案 0 :(得分:13)
您正在寻找的命令已被取消。
disown <processid>
这就像你可以获得一个nohup一样接近。它将进程与当前登录分离,并允许它继续运行。谢谢David Korn!
http://www2.research.att.com/~gsf/man/man1/disown.html
我刚刚找到了reptyr,它可以让你重新发现一个不相关的进程。 https://github.com/nelhage/reptyr
它已经在ubuntu的包中了。
答案 1 :(得分:5)
您可能还会考虑screen
命令。它具有“恢复我的会话”功能。不可否认,我从未使用它,忘了它。
在重新捕获stdout / stdin方面,以守护进程或nohup
启动进程可能无法完成所需的一切。
网上有很多例子。在谷歌尝试,“unix屏幕命令”和“unix屏幕教程”:
答案 2 :(得分:4)
“UNIX妖魔化进程”的第一个google结果:
有关简短概述,请参阅守护程序(3)联机帮助页。守护进程的主要内容 在没有退出或举起任何东西的情况下进入后台。的列表 一个过程可以做到的事情:
如果以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)
),但这是一种非常有限的交互,并且取决于您收到这些信号时编写的程序是否做了明智的事情(信号USR1
和USR2
是陷阱的有用信息,如果你遇到那种事情的话。或者,您可以通过命名管道或信号量或其他进程间通信(IPC)进行交互。那很快就会变得非常繁琐。
我怀疑你所追求的是能够将终端重新连接到该过程。这是一个相当复杂的过程,像screen
这样的应用程序在幕后做了相当复杂的事情来实现这一点。
nohup
这是一种快速而肮脏的守护进程。 daemon(3)
函数正确执行守护程序,按照YePhIcK的回答进行各种整理,以全面断开与调用它的进程/终端的链接。您可以使用与上述相同的IPC工具与该守护进程进行交互,但不能直接使用终端进行交互。