如何在Linux命令行中干净地关闭Eclipse?

30
有没有一种方法可以通过命令行干净地关闭Eclipse,以便文件和工作区被保存?kill -3没有任何效果。kill -1和kill -15(默认)会导致Eclipse突然退出并显示JVM终止弹出窗口。kill -9也会做同样的事情。
这个使用场景是,我远程在一台装有Eclipse的机器上工作,我想通过关闭Eclipse来节省内存,但是我希望Eclipse先保存它的状态。
我可以使用VNC或其他桌面共享软件,但那太重了,我更喜欢一个命令行解决方案。
编辑:系统信息:RHEL5.1 64位,使用GNOME。
7个回答

43

借助于gigi的回答另一个问题,我解决了这个问题。你需要从软件包管理器中获取wmctrlxdotool工具。

除非你在同一显示器上运行终端仿真器,否则你需要设置正确的显示器:

$ export DISPLAY=:0.0

然后(示例中省略了无关窗口):

# List windows
$ wmctrl -l
...
0x030000fa  0 kcirb Java - Eclipse

# Tell Eclipse window to close gracefully
$ wmctrl -c eclipse

# Darn, there's a confirmation dialog
$ wmctrl -l
...
0x030000fa  0 kcirb Java - Eclipse 
0x03003c2d  0 kcirb Confirm Exit 

# Send return key to the window
$ xdotool key --window 0x03003c2d Return

在Ubuntu 12.04上对我有效,至少如此。

编辑:参见Scarabeetle的答案以获得在脚本中运行所需的调整。


3
谢谢!那个方法很完美。有一个小的改进点是 xdotool search Exit 是不必要的,因为它会返回 0x03003c2d 的十进制形式。你可以直接使用 wmctrl -l 中的十六进制窗口ID,例如 xdotool key --window 0x03003c2d Return,跳过搜索步骤。 - rkyser

7

信誉度不足,无法对上面Pidge的回答进行评论... 它几乎可以工作了,但我需要等待一些Gnome3动画完成,然后将焦点放在“确认退出”窗口上:

export DISPLAY=:0.0        # Do this in main X session
wmctrl -c "Eclipse SDK"    # Close main window
sleep 1                    # Wait for animation
wmctrl -a "Confirm Exit"   # Give focus to the dialog
# Send a Return keypress to press the OK button
xdotool key --window $(xdotool search "Confirm Exit") Return

3
任何添加的ShutdownHooks更多信息在此处)应该在JVM被SIGTERM终止时执行。因此,我认为问题在于Eclipse处理这些信号的方式。

由于我不知道Eclipse中的清理过程是如何实现的,所以我只能假设它不是通过任何ShutdownHook(而是通过Action或类似物)来调用的。

编辑:pidge提供了下面的答案,其中详细说明了一些步骤,可以让您从命令行安全地关闭Eclipse。


1
这是正确的。插件开发人员可以编写一个插件来侦听套接字上的关闭命令,并调用 IWorkbench.close()。或者Eclipse和启动器可以升级以支持更多操作,而不仅仅是openFile操作。但是Eclipse默认情况下没有任何功能可用。 - Paul Webster
今天我刚刚调用了 $ kill pid。 - jorgeu
kill -HUP pid 对我来说很有效。这会关闭Eclipse,但仍然给它删除所有锁定文件的机会等。 - Andrew Rice

3
尝试结束 Java 进程。执行 ps -ea | grep java 命令。

1

你尝试过使用wmctrl吗? wmtrl -l 可以列出窗口, wmlctrl -c -P 可以关闭窗口。 不过你可能会遇到eclipse的确认对话框问题。


安装了它并稍微调试了一下。远程(通过ssh shell)无法工作。本地上,甚至没有列出eclipse窗口。也许我只是用错了? - Maian
如果您正在远程运行命令,则需要设置DISPLAY环境变量export DISPLAY=:0.0。请参阅我的答案以获取详细步骤。 - pidge

0
你尝试过使用kill -HUP (kill -1)命令吗?这是告诉进程与其交互的人已经离开,它应该适当地清理的规范方式。

不行,这没起作用 - Eclipse突然退出(弹出JVM终止消息)。 - Maian

0

这个问题的答案对我在类似的问题上很有帮助:Eclipse挂起,如何正确杀死它?

在我杀掉Eclipse进程后,Eclipse窗口仍然存在,直到我杀掉了Java进程(与上面的答案不同,我只有一个“java”进程,当我杀掉它时,问题得到解决)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接