这是命令序列,gedit
启动,但无法从其进程 ID 中杀死它
$ gedit&
$ t=$!
$ echo $t
4824
$ kill $t
bash: kill: (4824) - No such process
它对于一个过程来说效果很好sleep
,比如
sleep 999&
[1] 4881
$ t=$!
$ echo $t
4881
$ kill $t
$ ps -p $t
[1] Terminated sleep 999
有什么不同?如何gedit
终止该进程?
答案1
这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
服务器是否已在运行。如果您没有这样做,您就会处于塞维埃拉的境地,并想知道为什么您没有看到所描述的行为。如果有,您将处于自己的位置并看到该gedit
过程几乎立即终止,特别是因为您没有为其提供任何命令行选项或参数以发送到“第一个实例”。因此,不再有具有该 ID 的进程。
正如上面提到的,当每次登录的桌面总线切换到每用户桌面总线的“新”样式时,就会产生很多乐趣,并且突然间桌面总线和 X 显示之间不再存在 1:1 的关系。更多的。单个用户总线范围的实例应用程序突然必须能够同时与多个 X 显示器通信。
当人们尝试gedit
通过 以超级用户身份运行时sudo
,会发生进一步的欢闹,因为它要么无法连接到每个用户的桌面总线,要么连接到错误的(超级用户的)桌面总线。
有人建议提供gedit
一个命令行选项,使调用的进程只是实际的编辑器应用程序,因此这gedit
将很有用,因为编辑器由环境变量指向(当它立即退出时,EDITOR
它不适用于EDITOR
, from crontab
to的许多常见用法)。git
这一提议尚未成为现实。
与此同时,人们可以通过各种方式获得“轻量级文本编辑器”的第二个简单实例,例如调用一个全新的桌面总线实例,该实例是gedit
,的调用私有的dbus-run-session
。当然,这往往会在该专用总线上启动其他 GNOME 桌面总线服务器,因为它们依次由 调用gedit
,这使得它根本不是“轻量级”的。
锦上添花是当你跟随这个建议或者类似的方法并插入一个名为 的 shell 函数gedit
,该函数立即gedit
从 shell 的作业列表中删除该进程。该进程不仅会快速终止,以便您稍后不会使用kill
或看到它ps
,而且 shell 甚至不会将其作为 shell 控制的作业进行监视。
进一步阅读
- 应用程序/Gedit/NewSingleInstance。 GNOME 维基百科。 2013年。
- ”描述“
GApplication
..GNOME 开发者维基。 - https://stackoverflow.com/questions/7553452/
- Stefan Löffler(2011-05-04)。 从 nautilus 启动时不重用正在运行的实例。错误#777292。发射台。
答案2
抱歉地说,但这对我有用:
$ gedit&
[1] 9391
$ t=$!
$ echo $t
9391
$ kill $t
[1]+ Terminated gedit
ps -ef
通过执行或检查进程是否仍然存在pidof gedit
。如果是这样,你也可以这样做kill $(pidof gedit)
答案3
我已经尝试过以下代码并且它在脚本中有效,请尝试一下
gedit&
t=$!
echo $t
#sleep 2
kill -9 $t