我有一个不会死的应用程序:它已经从基座上消失了,但是窗口仍然存在(如果我将鼠标悬停在上面,还有一个沙滩球)。它没有使用CPU,但我希望它消失。
是否有比“强制退出”更强大的功能才能真正杀死应用程序?
我有一个不会死的应用程序:它已经从基座上消失了,但是窗口仍然存在(如果我将鼠标悬停在上面,还有一个沙滩球)。它没有使用CPU,但我希望它消失。
是否有比“强制退出”更强大的功能才能真正杀死应用程序?
Answers:
如果您知道该应用程序的名称,则可以在活动监视器中查看它是否仍在运行,然后尝试强制退出。如果这不起作用,请记下该应用的进程ID(pid)。转到终端并输入kill [pid]
,用您之前记下的数字替换“ [pid]”。如果那不起作用,请尝试kill -3 [pid]
,如果那不起作用kill -9 [pid]
。如果该进程由另一个用户拥有(这不太可能),则可能需要替换kill
为sudo kill
并在提示时输入密码。
如果该应用程序未显示在“活动监视器”中或您无法显示kill
,则该窗口可能是残留在其他地方的窗口,并且该应用程序不再运行。在这种情况下,有时(并非总是)它可以工作于killall SystemUIServer
或killall Dock
。
如果这些都不起作用,则必须注销并重新登录或重新启动。到现在为止,有几次,应用程序被卡住了,以至于无法注销或关闭,因此我不得不硬重启。
sudo
,即使该过程是我所有,也包括在内),没有任何更改。会killall SystemUIServer
影响我其他任何打开的应用程序,例如忘记窗口位置吗?
kill -l
,-3是SIGQUIT,而-9是SIGKILL(“不可捕获,不可忽略的杀戮”)。
man kill
(这是有史以来十大最佳UNIX命令中的内容)以查看所有内容。
强制退出窗口,killall
并且kill
默认情况下所有发送过程都发送TERM信号。killall -kill
如果不行,可以使用。
killall实用程序杀死按名称选择的进程,而不是像kill(1)那样按pid进行选择。默认情况下,它将向所有进程发送一个TERM信号,该进程的真实UID与killall的调用者相同,且与名称procname匹配。超级用户被允许杀死任何进程。
如果您sudo dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }'
从强制退出窗口运行并退出某些应用程序,则信号通常显示为-15(TERM)。但是,当您从“活动监视器”中退出后台进程(或Dock中未显示的应用程序)时,该信号通常显示为-9(KILL)。
SIGTERM是通过kill或killall命令发送给进程的默认信号。它导致进程终止,但是与SIGKILL信号不同,它可以被进程捕获和解释(或忽略)。因此,SIGTERM类似于要求进程很好地终止,从而允许清理和关闭文件。因此,在许多Unix系统上,在关闭期间,init将SIGTERM发出对关闭电源不是必不可少的所有进程,等待几秒钟,然后发出SIGKILL强制终止任何剩余的此类进程。
SIGKILL
正常运行,则该应用可能处于不间断的睡眠状态,实际上您无能为力(除非重新启动)。
如上述答案所示,终止任何进程的最有效方法是SIGKILL
例如kill -9 process_id
。
然而,有哪些是根本不可能的过程Force Quit
也不是kill
。他们称之为zombie
流程。
这是一个简短的脚本,它将创建一个zombie
两分钟的过程:
perl -e 'if($p=fork) {print "unkillable pid:$p\n" ;system("ps -l"); sleep(120)}'
在终端中运行以上脚本,您将获得输出,如下所示:
unkillable pid:50571
UID PID PPID F CPU PRI NI SZ RSS WCHAN S ADDR TTY TIME CMD
501 47380 47379 4006 0 31 0 2448416 2900 - S 0 ttys000 0:00.36 -bash
501 50570 47380 4006 0 31 0 2443512 1424 - S+ 0 ttys000 0:00.01 perl -e if($p=fork) {print "u
#THIS-> 501 50571 50570 2006 0 0 0 0 0 - Z+ 0 ttys000 0:00.00 (perl)
501 12795 12794 4006 0 31 0 2448296 1752 - S+ 0 ttys001 0:00.75 -bash
501 50123 50122 4006 0 31 0 2448296 2688 - S+ 0 ttys002 0:00.14 -bash
如果检查状态列中是否存在不可终止的进程(在本例中为50571),则会看到该Z
标志,表示什么意思zombie
。
您可以尝试发送任何kill
信号(例如kill -9 50571
),并且该过程仍然存在。无论如何,它不会对您的系统造成太大伤害,因为它实际上并不存在-仅占用进程表。
在上面的示例中,将在120秒内将其清除。