如何从终端强制退出Applescript应用程序?


3

我写了一个打开灯的AppleScript。我将其导出为名为“LightsOn”的应用程序,并在活动监视器中显示该名称。

活动监视器中的LightsOn

在某些情况下,这个应用程序卡住了。我可以强制从Activity Monitor退出它,但我希望能够从脚本中执行此操作。killall LightsOn不起作用; 我被告知了no matching processes belonging to you were found

如何从终端强制退出此应用程序?或者,我怎样才能找到killall的合适名称?


1
pkill -9 -f LightsOn会做的!
user3439894

@ user3439894是的,这很容易!我一直试图弄清楚如何做这个年龄。如果你做出答案,我会接受的!
Wowfunhappy

根据要求,我发布了一个答案,覆盖了我对你的评论,这个答案对原来没有的答案起了作用,但后来经过编辑。我添加了额外的信息来说明为什么killall LightsOn不起作用。
3439894

而不是需要杀死为什么不在您的应用程序中编写超时?
ʀ2ᴅ2Oct

@ʀ2ᴅ2很长的故事,但简短的版本是因为(1)这是一个看不见的助手应用程序,所以它并不重要,并且(2)没有好的方法为Applescript中的shell脚本设置超时,并且什么是可行的是挑剔和容易出错。
Wowfunhappy

Answers:


2

原因killall LightsOn不起作用是因为所有运行的AppleScript应用程序的进程名称都是applet。例如,可执行路径是:

../LightsOn.app/Contents/MacOS/applet

一般而言,假设进程未被挂起,可以使用killall applet终止所有正在运行的AppleScript应用程序,当然这可能并不理想。

当进程挂起时,您需要使用KILL 信号,例如:

killall -KILL applet

但是,pkill是否可以轻松定位特定的AppleScript应用程序,因为它已挂起...使用KILL 信号,例如:

pkill -9 -f LightsOn

要么:

pkill -KILL -f LightsOn

请注意,在这个例子中,-9只是另一种说法-KILL

现在使用pkill和使用该-f 选项,可以使用更多的完整参数列表,例如:

pkill -9 -f /Applications/LightsOn.app/Contents/MacOS/applet

然后,对于哪个applet 进程的目标没有歧义。可以使用尽可能多的完整参数列表,因为人们认为有必要针对正确的过程

例如,pkill -9 -f LightsOn将终止名为的AppleScript应用程序NoLightsOn,因此始终使用足够的完整参数列表来终止正确的进程。


以供参考:

pkill手册页:

 -f          Match against full argument lists.  The default is to match
             against process names.

killall手册页:

 Some of the more commonly used signals:

 1       HUP (hang up)
 2       INT (interrupt)
 3       QUIT (quit)
 6       ABRT (abort)
 9       KILL (non-catchable, non-ignorable kill)
 14      ALRM (alarm clock)
 15      TERM (software termination signal)

请注意,这只是一个部分信号列表,并与许多可以终止进程的不同实用程序一起使用。有关其他信息,请参阅用于实用程序的各种手册页。


1

试试这个:

ps auxwww | fgrep -v fgrep | fgrep -i LightsOn

这应该显示匹配的过程信息。

你也可以尝试pkill哪个应该这样工作:

pgrep -fl LightsOn

如果它显示PID,那么您可以继续pkill

pkill -9 -f LightsOn

当你运行pkill -9时,你并没有告诉应用程序自行终止,而是告诉操作系统停止运行程序,无论程序在做什么。

当应用程序卡住发送而kill没有指定信号#时,它会自动为其分配信号<15>,这意味着要求应用程序自行终止它,卡住时不能这样做。


你说,试试这个:ps auxwww | fgrep -v fgrep | fgrep -I LightsOn,为什么!?什么时候pkill -9 -f LightsOn会这样做!
user3439894

pkill -fl LightsOn没有杀死我的机器上的应用程序。我似乎需要-9。
Wowfunhappy

@ user3439894第一个命令从来没有打算杀死进程,只是为了显示它的信息,这可能有助于解释为什么killall没有做到预期的事情。pkill -9是一种钝器,不是第一步。IMO。
TJ Luoma
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.