如何在 JXA 中检查进程是否已按名称 运行
How to check if process is already running by name in JXA
使用 /usr/bin/osascript
JS 来自动化我的任务,努力检查进程是否已经 运行:
const app = Application.currentApplication()
app.includeStandardAdditions = true
function run(args) {
const query = args[0]
let response = 'Wrong command passed'
if (query === 'on') { // need to check if process named "asdf" is already running
response = 'Process turned ON'
} else if (query === 'off') { // need to check if process named "asdf" is already running
response = 'Process turned OFF'
}
return response
}
JXA 文档可能会更好,我想在 if 构造中实现检查。我尝试使用:
const se = Application('System Events')
const process = se.processes.byName('processname')
但是没有效果
自己解决了:
const PNAME = `ps aux | grep processname | grep -v grep | wc -l | xargs echo`
获取processname
,如果是运行,则returns1
,否则0
。剩下要做的就是:
if (app.doShellScript(PNAME) < 1) {
// do something
} else {
// do something else
}
Solved myself:
const PNAME = `ps aux | grep processname | grep -v grep | wc -l | xargs echo`
Getting "processname", if it's running, it returns 1, otherwise 0.
如果我调用 shell 来执行此操作,我的目标是使其成为尽可能高效的命令组合。 xargs
、wc
和进入 grep
的第二个管道都是不必要的:如果 grep processname
匹配,则命令的退出状态将为 0
,并且在所有其他情况,非零。看起来你通过管道连接到其他程序的唯一原因是你在调用 ps
:
时没有使用最有效的程序选项集
const PNAME = 'ps -Acxo comm | grep processname > /dev/null; echo $(( 1 - $? ))'
甚至不需要使用 grep
,因为 bash
可以为您进行模式匹配:
const PNAME = '[[ "$( ps -Acxo comm )" =~ processname ]]; echo $(( 1 - $? ))'
但是,把它放在一边,除非我正在编写 shell 脚本,否则我不会得到一个 shell 脚本来执行此操作。 JXA 非常擅长枚举进程:
sys = Application('com.apple.SystemEvents');
sys.processes.name();
然后,确定一个特定的命名进程,例如TextEdit,是运行:
sys.processes['TextEdit'].exists();
相应地 return true
或 false
。
使用 /usr/bin/osascript
JS 来自动化我的任务,努力检查进程是否已经 运行:
const app = Application.currentApplication()
app.includeStandardAdditions = true
function run(args) {
const query = args[0]
let response = 'Wrong command passed'
if (query === 'on') { // need to check if process named "asdf" is already running
response = 'Process turned ON'
} else if (query === 'off') { // need to check if process named "asdf" is already running
response = 'Process turned OFF'
}
return response
}
JXA 文档可能会更好,我想在 if 构造中实现检查。我尝试使用:
const se = Application('System Events')
const process = se.processes.byName('processname')
但是没有效果
自己解决了:
const PNAME = `ps aux | grep processname | grep -v grep | wc -l | xargs echo`
获取processname
,如果是运行,则returns1
,否则0
。剩下要做的就是:
if (app.doShellScript(PNAME) < 1) {
// do something
} else {
// do something else
}
Solved myself:
const PNAME = `ps aux | grep processname | grep -v grep | wc -l | xargs echo`
Getting "processname", if it's running, it returns 1, otherwise 0.
如果我调用 shell 来执行此操作,我的目标是使其成为尽可能高效的命令组合。 xargs
、wc
和进入 grep
的第二个管道都是不必要的:如果 grep processname
匹配,则命令的退出状态将为 0
,并且在所有其他情况,非零。看起来你通过管道连接到其他程序的唯一原因是你在调用 ps
:
const PNAME = 'ps -Acxo comm | grep processname > /dev/null; echo $(( 1 - $? ))'
甚至不需要使用 grep
,因为 bash
可以为您进行模式匹配:
const PNAME = '[[ "$( ps -Acxo comm )" =~ processname ]]; echo $(( 1 - $? ))'
但是,把它放在一边,除非我正在编写 shell 脚本,否则我不会得到一个 shell 脚本来执行此操作。 JXA 非常擅长枚举进程:
sys = Application('com.apple.SystemEvents');
sys.processes.name();
然后,确定一个特定的命名进程,例如TextEdit,是运行:
sys.processes['TextEdit'].exists();
相应地 return true
或 false
。