语境:-
&
我在后台模式下运行一个带有附加 ie 的 bash 进程。该进程有一个while(1)
ie,它将永远运行。我的 bash 是父进程,我的进程成为子进程。我想了解当父进程终止时内核如何处理子进程。
观察结果:-
- 如果我退出终端(使用
exit
终端命令),则/lib/systemd/systemd --user
成为子进程的父进程 - 如果我从另一个终端终止终端进程(使用
kill
),结果与上述相同 - 如果我使用十字图标关闭终端,子进程也会终止
问题:-
关闭与杀死/退出有何不同?
答案1
Linux 中有不同类型的信号。当您exit
关闭终端时,发送的信号与您通过单击关闭终端时发送的信号不同x
。尝试通过终止信号了解关闭和退出终端之间的区别。
答案2
这样启动的进程是终端程序打开的./myprocess &
父进程的子进程。该标志不会帮助您在长进程结束之前关闭终端窗口。bash
&
您正在寻找的是命令nohup
user@host:~$ nohup bash -c '/path/to/myprocess'
更多信息 :
http://manpages.ubuntu.com/manpages/impish/en/man1/nohup.1.html
一些例子:
https://linuxhint.com/nohup_command_linux/
答案3
我ping
在gnome-terminal
窗口中使用了它,我可以确认你的观察结果。我认为一个进程可以在没有任何通信的地方运行是有问题的。我将尝试解释我注意到的内容(但我并不认为我理解为什么,也许允许具有自己的 GUI 的程序在终端窗口中启动时无需nohup
退出即可工作)。bash
当我
exit
退出bash
终端窗口的运行,并ping
继续运行,但却无处可写。当我
kill
这个过程时,我杀死bash
在终端窗口中查看进程。我没有找到gnome-terminal
要终止的明确进程,因为该进程/usr/lib/gnome-terminal/gnome-terminal-server
会运行所有进程。我不确定这是你正在做的事情,但我猜是这样。当我关闭窗口(使用 x 按钮)时,我退出窗口进程(这反过来会强制其子进程停止包括
bash
和ping
)。这与前两种情况有明显的区别。
当我用 做相应的练习时xterm
,将会出现一个名为“xterm”的单独进程。
当我
exit
退出bash
终端窗口的运行,并ping
继续运行,但却无处可写。当我
kill
该进程时,我终止了xterm
终端窗口的进程,(这反过来又强制其子进程停止,包括bash
和ping
)。当我关闭窗口(使用 x 按钮)时,我退出窗口进程(这反过来迫使其子进程停止,包括
bash
和ping
)。
您已经知道,如果您希望在关闭启动子进程的终端窗口后继续运行子进程,则可以使用nohup
(与)。&
编辑 1:最终评论:
从man bash
如果命令以控制操作符 & 结束,则 shell 将在子 shell 中在后台执行该命令。shell 不会等待命令完成,返回状态为 0。
我们注意到,退出时没有信号停止子 shell 以及在该子 shell 中/从该子 shell 启动的进程bash
,至少在终端窗口中运行时没有。但调用终端窗口已关闭。我认为,退出 bash 后,终端窗口不再知道子 shell 以及在该子 shell 中/从该子 shell 启动的进程,因此无法停止它们。
编辑 2:我向Unix 和 Linux - 请阅读答案。