如何在 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 来执行此操作,我的目标是使其成为尽可能高效的命令组合。 xargswc 和进入 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 truefalse