【问题标题】:How to Launch Asynchronous Background Process in JXA如何在 JXA 中启动异步后台进程
【发布时间】:2019-10-25 06:00:33
【问题描述】:

我正在尝试从 JXA(自动化 JavaScript)Mac 应用程序中运行 HTTP 服务器。这部分很简单:

app.doShellScript("python -m SimpleHTTPServer");

(更多信息:https://github.com/JXA-Cookbook/JXA-Cookbook/wiki/Shell-and-CLI-Interactions

问题是,在你这样做之后,应用程序进程会停止,因为 shell 脚本实际上并没有退出。

那么……我们只需要让服务器作为后台进程运行,对吧?不幸的是,我尝试过的所有方法都没有将控制权转移回 JXA 应用程序

这是我尝试过的:

  1. app.doShellScript("nohup python -m SimpleHTTPServer > /dev/null <&- >&- 2>&- & disown");
  2. app.doShellScript("( python -m SimpleHTTPServer > /dev/null & )");
  3. $.system("( python -m SimpleHTTPServer & )");
  4. 编写了一个 python 脚本,该脚本将启动另一个运行服务器并退出的进程
  5. 在 Node.js 中尝试过同样的事情
  6. 尝试了一个可以启动服务器并以exit 0 结尾的shell 脚本
  7. 尝试启动 cron 作业,该作业将立即启动 shell 脚本,从而启动服务器,但 CRON 似乎存在沙盒问题。
  8. $.NSTask 的各种 hack

似乎最终的解决方案将涉及以与 JXA 应用程序完全 100% 零知识分离的方式启动后台进程。

【问题讨论】:

  • app 在这种情况下指的是终端对吗?因此,一种解决方案可能是创建两个 app 对象...一个用于运行 http 服务器,另一个用于执行任何操作

标签: javascript macos cocoa automator javascript-automation


【解决方案1】:

所以在系统重新启动后,结果证明这是可行的:

$.system("nohup python -m SimpleHTTPServer > /dev/null &");
console.log("Non-blocking!");

(感谢 StackOverflow 成为我的rubber duck。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多