劣质 Shell 或 UIOP:与后台进程交互
Posted
技术标签:
【中文标题】劣质 Shell 或 UIOP:与后台进程交互【英文标题】:Inferior Shell or UIOP: Interacting with background process 【发布时间】:2016-09-01 12:30:24 【问题描述】:所以,我实际上已经通过了使用劣质外壳从 SBCL Lisp 运行程序(大概 UIOP 就可以了)。无论如何,现在我可以做到这一点,如果程序在后台运行,我仍然不知道如何与程序交互。
所有这些功能,如连接到运行程序的标准输入和标准输出的管道和流,都被宣传了,只是没有记录。看起来这是最基本的事情。
有没有人做这种事的例子?
感谢任何帮助。
-托德
【问题讨论】:
这对于 SO 来说可能是一个过于宽泛的问题。你有一个简单的例子来展示吗?在哪些情况下不符合您的预期? @Renzo 我理解它的方式:SBCL 有sb-ext:run-program
,可以让您异步启动进程并将输入和输出流连接到它。然后,您可以在程序的生命周期内使用流与它进行通信(例如,启动 gnuplot
并保持它运行并使用相同的进程进行绘图,而不是一直重新启动它)。以可移植的方式,我只看到同步:启动进程并传递启动参数 - 等到它完成。
EAZY-PROCESS
库使创建管道和异步进程变得容易,但故意不提供对流的支持。一切都基于文件和文件描述符。不过,您可以使用临时文件。
【参考方案1】:
您看过 SBCL 手册吗? RUN-PROGRAM
的选项记录在那里:
http://www.sbcl.org/manual/#Running-external-programs
我认为您只需要创建流并通过:input
、:output
和:error
参数将它们传递给RUN-PROGRAM
。
这是一个示例,我提供RUN-PROGRAM
流参数以执行gnuplot
(尽管我没有按照您的意愿打开输入流)。
https://github.com/belambert/cl-gnuplot/blob/master/src/gnuplot.lisp#L18
【讨论】:
是的。显而易见的事情是使用 sb-ext:run-program,但是,我必须运行的命令行是:/usr/bin/java -cp "*" -Xmx2g edu.stanford.nlp.pipeline.StanfordCoreNLP -注释器 tokenize,ssplit,pos,lemma,ner,parse,dcoref -outputFormat text 这里的问题是,星号周围的引号,当用反斜杠转义时,当然。我尝试使用带引号的 args 运行其他 java 程序,但它们也不起作用。另外,感谢 gnuplot 示例。我确实有类似的需求! @ToddPierce 你不需要引用参数,除非 shell 看到它们,这里没有。以上是关于劣质 Shell 或 UIOP:与后台进程交互的主要内容,如果未能解决你的问题,请参考以下文章
Linux Shell & 放在启动参数后面表示设置此进程为后台进程
linux shell脚本执行命令时创建子进程问题(特定的情况,例如后台运行管道分支或子shell等,脚本可能会创建子进程执行命令)
linux shell脚本执行命令时创建子进程问题(特定的情况,例如后台运行管道分支或子shell等,脚本可能会创建子进程执行命令)