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
终止进程?
该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
,从crontab
到git
,当它立即退出时)。这个提议还没有成为现实。
与此同时,人们有各种方法来拥有一个简单的“轻量级文本编辑器”的第二个实例,例如调用一个全新的桌面总线实例,私有于 的调用gedit
,使用dbus-run-session
. 当然,这往往会在这个私有总线上启动其他 GNOME 桌面总线服务器,因为它们依次被 调用gedit
,使其根本不是“轻量级”。
锦上添花的是当您遵循此建议或类似建议并插入一个名为的 shell 函数时gedit
,该函数会立即gedit
从 shell 的作业列表中删除该进程。不仅进程会迅速终止,因此您以后不会用kill
或看到它ps
,而且外壳甚至不会将其作为外壳控制的作业进行监视。
GApplication
. GNOME 开发人员的维基。