为什么 gksudo 启动后台进程后不退出?

为什么 gksudo 启动后台进程后不退出?

我正在尝试使用 gksudo 运行 conky(在所有进程中处于领先地位,而不仅仅是我的进程),但我遇到了非常奇怪的问题。尽管 conky 自行分叉并立即退出,但 gksudo 不会同时退出。如果我使用 Ctrl+C 关闭它,conky 会继续运行,这证明它已成功分叉。我如何让 gksudo 看到它启动的进程已结束并将我的 shell 还给我?

答案1

什么时候康基分叉自身并退出,父进程执行命令创造的将继续存在僵尸进程

在 Unix 和类 Unix 计算机操作系统中,僵尸进程或已停用进程是已完成执行但仍在进程表中有条目的进程。仍然需要此条目来允许启动(现在是僵尸)进程的进程读取其退出状态。僵尸进程这个术语源自僵尸的常见定义——不死之人。在这个术语生动的比喻中,子进程已经死亡,但尚未被收割。

只要这个过程存在,执行命令将继续运行。从其手册页来看:

成功执行程序后,sudo 的返回值将只是所执行程序的返回值。

如果你以交互方式运行它,请按照建议在后台运行它;对于非交互式使用,通过 /etc/sudoers 文件向 conky 或包装脚本授予 root 权限

编辑:使用另一个答案中的 gvim 示例:

$ #gksudo running
$ ps -ef | grep gvim
171:nagul    22876  9378  0 12:18 pts/1    00:00:00 gksudo gvim
172:root     22877 22876  0 12:18 ?        00:00:00 [gvim] <defunct>
176:root     22892     1  0 12:18 ?        00:00:00 gvim

$ #gksudo killed via Ctrl-C
$ ps -ef | grep gvim
174:root     22892     1  0 12:18 ?        00:00:00 gvim

答案2

在我看来,gksudo 从来不会这样做。例如,启动 gvim 时,它会返回一个可用的 shell。但使用 gksudo 启动它会阻止该 shell。

您可以做的最简单的事情是在后台运行它:

gksudo conky &

相关内容