当我在终端的后台启动一个进程时,如果终端关闭,我们将无法再与该进程交互。我不确定,但我认为进程也会被杀死。谁能告诉我如何将该进程从我的终端中分离出来。因此,即使我关闭终端,我也可以在新终端中与相同的进程进行交互?
我是 unix 新手,所以您的额外信息将对我有所帮助。
当我在终端的后台启动一个进程时,如果终端关闭,我们将无法再与该进程交互。我不确定,但我认为进程也会被杀死。谁能告诉我如何将该进程从我的终端中分离出来。因此,即使我关闭终端,我也可以在新终端中与相同的进程进行交互?
我是 unix 新手,所以您的额外信息将对我有所帮助。
您正在寻找的命令是不承认的。
disown <processid>
这是尽可能接近 nohup 的方法。它将进程与当前登录分离并允许它继续运行。谢谢大卫科恩!
http://www2.research.att.com/~gsf/man/man1/disown.html
我刚刚找到了 reptyr,它可以让你重新处理一个不承认的进程。 https://github.com/nelhage/reptyr
它已经在 ubuntu 的软件包中了。
您也可以考虑该screen
命令。它具有“恢复我的会话”功能。诚然,我从未使用过它,并且忘记了它。
将进程作为守护进程启动,或者nohup
在重新捕获标准输出/标准输入方面可能无法完成您想要的一切。
网上有很多例子。在谷歌上尝试,“unix 屏幕命令”和“unix 屏幕教程”:
“UNIX恶魔化进程”的第一个谷歌结果:
有关简短概述,请参见 daemon(3) 联机帮助页。守护进程的主要内容是在不退出或阻止任何事情的情况下进入后台。一个进程可以做的事情的列表来实现这一点:
如果作为 root 进程启动,您还想先做您需要成为 root 的事情,然后再删除权限。也就是说,使用 setuid()/setgid() 将有效用户更改为“daemon”用户或“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
命令告诉外壳程序启动程序,并以忽略此 HUP 信号的方式执行此操作。也就是说,程序在调用终端退出后继续运行。
您仍然可以通过向它发送信号来与该程序进行交互(kill(1)
再次查看),但这是一种非常有限的交互方式,并且取决于您的程序被编写为在接收到这些信号时执行明智的事情(信号USR1
和USR2
有用的事情可以捕获,如果你喜欢那种事情)。或者,您可以通过命名管道、信号量或其他进程间通信 (IPC) 进行交互。这很快就会变得很繁琐。
不过,我怀疑您所追求的是能够将终端重新连接到该进程。这是一个相当复杂的过程,并且应用程序喜欢screen
在幕后做适当复杂的事情来实现这一点。
nohup
事情是一种快速而肮脏的守护进程。该daemon(3)
函数“正确”地执行守护进程,按照 YePhIcK 的回答中所述进行各种整理,以全面断开与调用它的进程/终端的链接。您可以使用与上述相同的 IPC 工具与该守护进程交互,但不能直接使用终端。