为什么用户启动的进程在未登录时运行?

为什么用户启动的进程在未登录时运行?

按照有关设置 gnupg 来管理 ssh 密钥的教程,我成功地运行了多个 gpg-agent 实例:

[root@frylock ~]# ps aux | grep agent
root      2764  0.0  0.0   4208   432 ?        Ss   11:15   0:00 ssh-agent
xtian     2785  0.0  0.1   3500   972 ?        Ss   11:18   0:00 gpg-agent -s --enable-ssh-support --daemon --write-env-file /home/frylock/xtian/.gnupg/gpg-agent.env
root      2958  0.0  0.0   3168   688 ?        Ss   11:39   0:00 gpg-agent -s --enable-ssh-support --daemon --write-env-file /root/.gnupg/gpg-agent.env
root      3036  0.0  0.0   4740   392 ?        Ss   11:43   0:00 gpg-agent --daemon
root      3186  0.0  0.0   4740   388 ?        Ss   11:53   0:00 gpg-agent --daemon
root      3299  0.0  0.0   4740   388 ?        Ss   11:58   0:00 gpg-agent --daemon
root      3549  0.0  0.0   4740   392 ?        Ss   12:54   0:00 gpg-agent --daemon

我可以通过第五次回顾说明来解决大部分混乱。但我不明白的是,当我只以 root 身份登录一个 tty 时,为什么我的用户帐户所有者是正在运行的进程?

答案1

一般来说,注销会终止与用户交互方式连接的应用程序。当您登录到文本终端(本地或远程)时,当您注销时(直接由内核或间接由 shell),连接到该终端的所有应用程序都会被终止。当您登录到图形环境时,当您注销时,所有连接到 X 服务器的应用程序都会被终止(或者更准确地说,与 X 服务器的连接被切断,这会导致大多数应用程序退出)。

注销不会终止用户启动的所有进程。用户可能想让程序在后台运行,或者登录到多个会话。

ssh-agent和等应用程序gpg-agent不是交互式的,因此它们不连接到任何终端或 X 服务器。正常的设置会安排他们通过其他方式被杀死。通常,代理是整个会话的父进程:会话启动脚本安排运行类似ssh-agent $SHELL或 的内容ssh-agent $SESSION_MANAGER。这样,当作为会话领导者的子进程退出时,代理也会退出(因为这就是代理的设计方式)。如果代理以不同方式启动,则由会话管理器安排终止它。

当您在遵循该教程的同时进行实验时,您显然以教程作者没有预料到的方式启动了许多代理进程,并且它们并没有随着您的会话而终止。你可以杀死那些你不使用的。一旦您达到稳定的设置,请检查代理在您注销时是否被杀死。 (除非您更喜欢运行单个代理并让它永久运行,这在个人计算机上可能是一个合理的选择。)

相关内容