无法从其 PID 中终止 gedit 进程

nig*_*d3r 1 shell process kill gedit background-process

这是命令序列,gedit启动,但不能从其进程 ID 中终止

$ gedit&
$ t=$!
$ echo $t
4824
$ kill $t
bash: kill: (4824) - No such process
Run Code Online (Sandbox Code Playgroud)

它适用于一个sleep过程,例如

sleep 999&
[1] 4881
$ t=$!
$ echo $t
4881
$ kill $t
$ ps -p $t
[1]   Terminated              sleep 999
Run Code Online (Sandbox Code Playgroud)

有什么不同?如何gedit终止进程?

Jde*_*eBP 5

gedit过程已经结束。

请记住,在 Win32 出现之前的 Win16 天中,Windows 应用程序主要是如何工作的,并废除了它:在有hInstance和的地方hPrevInstance,尝试运行许多应用程序的第二个实例只是将事情交给第一个实例,这使得事情变得困难命令脚本工具(如 Take Command),因为人们会第二次调用应用程序,它会在屏幕上作为一个附加窗口明显存在,但就命令解释器而言,它刚刚运行的子进程立即退出?

GNOME 已经为 Linux 带回了 Win16 行为。

使用 GIO 应用程序,如gedit,应用程序的行为如下:

  • 如果org.gnome.gedit每个用户/每个登录的桌面总线上没有已注册的“服务器” ,则gedit决定它是第一个实例。它成为org.gnome.gedit服务器,并继续运行。
  • 如果org.gnome.gedit每个用户/每个登录的桌面总线上已经有一个已注册的“服务器” ,则gedit决定它是第二个或后续实例。它构造桌面总线消息到第一个实例,传递其命令行选项和参数,然后简单地退出

所以你看到的取决于你是否gedit已经运行了服务器。如果您没有,您将处于 sebvieira 的位置,并想知道为什么您没有看到所描述的行为。如果你有,你会在你的鞋子里看到这个gedit过程几乎立即终止,特别是因为你没有给它任何命令行选项或参数来发送到“第一个实例”。因此,不再有具有该 ID 的进程的原因。

就像上面提到的,当每次登录的桌面总线切换到每用户桌面总线的“新”样式时,就会带来很多乐趣,并且桌面总线和 X 显示器之间突然之间没有 1:1 的关系。更多的。单个用户总线范围的实例应用程序突然必须能够同时与多个 X 显示器对话。

当人们试图gedit通过 以超级用户身份运行时,会出现进一步的欢笑sudo,因为它要么无法连接到每个用户的桌面总线,要么连接到错误的(超级用户的)桌面总线。

有一个提议提供gedit一个命令行选项,使被调用的进程只是实际的编辑器应用程序,因此这gedit将作为EDITOR环境变量指向的编辑器很有用(这不是许多常见用法EDITOR,从crontabgit,当它立即退出时)。这个提议还没有成为现实。

与此同时,人们有各种方法来拥有一个简单的“轻量级文本编辑器”的第二个实例,例如调用一个全新的桌面总线实例,私有于 的调用gedit,使用dbus-run-session. 当然,这往往会在这个私有总线上启动其他 GNOME 桌面总线服务器,因为它们依次被 调用gedit,使其根本不是“轻量级”。

锦上添花的是当您遵循此建议或类似建议并插入一个名为的 shell 函数时gedit,该函数会立即gedit从 shell 的作业列表中删除该进程。不仅进程会迅速终止,因此您以后不会用kill或看到它ps,而且外壳甚至不会将其作为外壳控制的作业进行监视。

进一步阅读