【问题标题】:Spawn child process, then later send argument to that process生成子进程,然后将参数发送到该进程
【发布时间】:2021-12-23 07:16:36
【问题描述】:

我想生成一个子进程,然后在稍后向它发送一个参数,然后它会执行。我怎样才能做到这一点? (NodeJS,在 Mac 上)

例如,我有一个执行脚本文件的命令:

osascript script-test.scpt

这个命令可以在终端运行,也可以用 exec 运行,像这样:

const { exec } = require('child_process')
var script = 'osascript script-test.scpt'
exec(script)

但是如何让它在已经运行的子进程中工作呢?

我尝试了以下方法,但没有任何反应(没有错误,也没有活动):

const { spawn } = require('child_process')
var process = spawn('osascript')
...
[at some later point (after spawned process has been created)]

process.stdin.write('script-test.scpt')

【问题讨论】:

    标签: node.js stdin child-process spawn osascript


    【解决方案1】:

    在所有当前的操作系统中,都会使用一组给定的参数(也称为argv,参数值)生成一个进程,并保留该组直到执行结束。这意味着您不能即时更改参数。

    对于在生成后支持多个作业提交的程序,它需要使用某种形式的通信显式实现这一点 - 这称为 IPC,或进程间通信。支持 IPC 的程序通常会允许另一个程序在一定程度上控制其行为 - 例如,提交作业以供处理并报告其完成情况。

    实施 IPC 的流行方法包括:

    • 网络通信
    • 通过“消息总线”(例如 D-Bus)进行本地呼叫
    • 管道(通过标准输入/标准输出直接通信)

    检查您尝试调用的程序的文档,并确定它是否支持上面列出的任何形式的控制。如果是,您可以(以特定程序的方式)与其集成。如果没有,那么每次需要处理新作业时都需要生成一个新实例。

    【讨论】:

    • 感谢您的回复。在我注意到的示例中,我将运行等效于 shell 命令来处理 osascript。在这种情况下,您是否有关于管道如何工作的代码(伪代码很好)?
    • 为了使管道工作和控制 osascript,osascript 程序必须支持它 - 您必须能够向它写入行,并且它应该响应您给它的每一行的结果。它是这样工作的吗?如果没有,那么就没有编程方式使其具有交互性,您只需为每个作业生成 1 个实例。
    • 这很有帮助。 osascript——就像我使用的那样——在 mac 上激活脚本,是一个可以在 bash/shell 中使用的命令,例如“$ osascript [脚本命令]”。写行是什么意思? (我不确定那会是什么样子)
    • python 为例。你可以只运行python,写“2+2”,按[Enter] - 你会得到“4”。写另一行来评估 - 你会得到另一个结果。如果 osascript 不能以这种方式工作,而是在完整处理它之前需要一个完整的程序 - 那么您将无法使用此方法,并且每次都必须 spawn() 。
    • 这是一个问题,其中 OP 已经成功地以交互方式将数据传输到/来自另一个进程:stackoverflow.com/questions/31615069/… - 请注意答案是错误的,因为缺少的部分是换行符,而不是 .end() !
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多