标签: spawn

spawn和exec有什么区别?

我正在学习编写TCL(期望)脚本,我注意到一些示例显示使用spawn,而其他示例显示命令exec.我试过谷歌搜索,但找不到有什么区别?

假设我在一个长期预期脚本的中间调用'exec',我可以期待发生什么?

scripting tcl exec expect spawn

21
推荐指数
3
解决办法
2万
查看次数

多处理 fork() 与 spawn()

我正在阅读python 文档中对两者的描述:

产卵

父进程启动一个新的 python 解释器进程。子进程将只继承运行进程对象 run() 方法所需的资源。特别是,父进程中不必要的文件描述符和句柄将不会被继承。与使用 fork 或 forkserver 相比,使用此方法启动进程相当慢。[在 Unix 和 Windows 上可用。Windows 和 macOS 上的默认设置。]

叉子

父进程使用 os.fork() 来派生 Python 解释器。子进程在开始时实际上与父进程相同。父进程的所有资源都由子进程继承。请注意,安全地分叉多线程进程是有问题的。[仅在 Unix 上可用。Unix 上的默认设置。]

我的问题是:

  1. 是不是分叉更快了,因为它不会尝试识别要复制的资源?
  2. 是不是因为 fork 复制了所有内容,与 spawn() 相比,它会“浪费”更多资源吗?

python fork multiprocessing spawn python-multiprocessing

18
推荐指数
2
解决办法
6127
查看次数

nodejs/express - 将stdout立即传送给客户端

我催生了下面的孩子:var spw = spawn('ping', ['-n','10', '127.0.0.1'])我希望在客户端(浏览器)上逐个接收ping结果,而不是整体.

到目前为止我试过这个:

app.get('/path', function(req, res) {
   ...
   spw.stdout.on('data', function (data) {
      var str = data.toString();
      res.write(str + "\n");
   });
   ...
}
Run Code Online (Sandbox Code Playgroud)

然后:

...
spw.stdout.pipe(res);
...
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,浏览器等待10个ping完成,然后将结果作为一个整体打印出来.我想逐个拥有它们,如何实现这一目标?

(客户端只是调用.../path和console.logs结果)


编辑:虽然我确实认为websockets是实现这一点所必需的,但我只是想知道是否还有其他方法.我看到了几个令人困惑的SO答案,以及博客帖子(在这篇文章中,第一步OP将日志流式传输到浏览器中)没有帮助,因此我决定寻求一些值得关注的赏金.

spawn child-process node.js express

17
推荐指数
1
解决办法
1万
查看次数

在node.js中使用参数生成进程

我需要从中生成一个子进程node.js,同时使用ulimit它来使用它来保存很多内存.

按照文档,让基本的spawn工作并不难:child = spawn("coffee", ["app.coffee"]).

然而,做我在下面做的只是让产生的声音无声无息.

child = spawn("ulimit", ["-m 65536;", "coffee app.coffee"])
Run Code Online (Sandbox Code Playgroud)

如果我会跑ulimit -m 65536; coffee app.coffee- 它的作用是有意的.

我在这做错了什么?

process spawn node.js

16
推荐指数
1
解决办法
2万
查看次数

Grunt产生的进程没有捕获输出

我使用Grunt生成了一个进程,但是没有任何写入输出流(例如console.log)的内容正在控制台中显示.

我希望Grunt显示该过程的任何输出.

grunt.util.spawn(
  { cmd: 'node'
  , args: ['app.js']
  , opts:
      { stdio:
          [ process.stdin
          , process.stout
          , process.stderr
          ]
      }
  })
Run Code Online (Sandbox Code Playgroud)

process spawn node.js gruntjs

15
推荐指数
1
解决办法
6100
查看次数

NodeJS生成stdout字符串格式

我在节点中生成一个进程并跟踪命令的输出,如下所示:

proc.stdout.on("data", function (data) {
    console.log(data.toString());
});
Run Code Online (Sandbox Code Playgroud)

它运作良好,但输出似乎是分裂线:

npm http
 304 https://registry.npmjs.org/underscore
Run Code Online (Sandbox Code Playgroud)

以上只是一个答案中的一行npm install.通常这只是一行,它还在响应之前和之后添加换行符.有没有办法让数据输出看起来像标准运行,即逐行?

stdout spawn node.js

15
推荐指数
2
解决办法
7519
查看次数

如何在node.js子进程模块中将消息以及stdout从子节点传递给父节点?

我遇到了子进程模块的问题,特别是child.spawn和child.fork.我依赖于child_process.fork的文档,其中说:

这是用于生成Node.js进程的child_process.spawn()功能的特例.除了在普通的ChildProcess实例中具有所有方法之外,返回的对象还具有内置的通信通道.有关详细信息,请参阅child.send(message,[sendHandle]).

我在下面简化了我的问题:

parent.js是:

var cp = require('child_process');
var n = cp.fork('./child.js');
n.send({a:1});
//n.stdout.on('data',function (data) {console.log(data);});
n.on('message', function(m) {
  console.log("Received object in parent:");
  console.log( m);
});
Run Code Online (Sandbox Code Playgroud)

child.js是:

process.on('message', function(myObj) {
  console.log('myObj received in child:');
  console.log(myObj);
  myObj.a="Changed value";
  process.send(myObj);
});
process.stdout.write("Msg from child");
Run Code Online (Sandbox Code Playgroud)

正如所料.输出是:

Msg from child
myObj received in child:
{ a: 1 }
Received object in parent:
{ a: 'Changed value' }
Run Code Online (Sandbox Code Playgroud)

我希望它与parent.js中的注释行一起使用,取消注释.换句话说,我想在n.stdout.on(父进程中的'data'...语句)中捕获子进程中的stdout.如果我取消注释它,我会收到一个错误:

n.stdout.on('data',function (data) {console.log(data);});
    ^
TypeError: Cannot read property 'on' of null
Run Code Online (Sandbox Code Playgroud)

我不介意使用任何子进程异步变量,exec,fork或spawn.有什么建议?

fork spawn child-process node.js

15
推荐指数
1
解决办法
6713
查看次数

节点child_process.spawn多个命令

我想自动创建和提取密钥库.我面临的问题是如何使用' |来加入命令 '符号或类似的解决方案.

//Original Command    
var command='keytool -exportcert -storepass mypass -keypass mypass  
-alias myalias -keystore mykey.keystore | openssl sha1 -binary | openssl base64';

//Arguments for the spawn    
var keyArgs = [
      '-exportcert',
      '-storepass','mypass',
      '-keypass','mypass',
      '-alias','myalias',
      '-keystore',"myjey.keystore",


      'openssl','sha1',
      '-binary',
      'openssl','base64',


  ];
exec('keytool',keyArgs,{cwd:appCreateFolder+"/"+opt.id+"/Certificates"},function(e){
    console.log(chalk.cyan('Key created'));
      })
Run Code Online (Sandbox Code Playgroud)

keytool spawn node.js

15
推荐指数
2
解决办法
1万
查看次数

Errno :: ENOMEM:无法分配内存 - 猫

我有一个正在运行的工作,它处理xml文件.xml文件大约为4k,大小为8到9 GB.

处理完毕后,我们将CSV文件作为输出.我有一个cat命令,它将所有CSV文件合并到我得到的单个文件中:

Errno :: ENOMEM:无法分配内存

on cat(Backtick)命令.

以下是一些细节:

  • 系统内存 - 4 GB
  • 交换 - 2 GB
  • Ruby:1.9.3p286

使用nokogiri和处理文件saxbuilder-0.0.8.

这里有一个代码块,它将处理4,000个XML文件,输出以CSV格式保存(每个xml 1个)(对不起,我不想在公司政策中分享它).

下面是将输出文件合并到单个文件的代码

Dir["#{processing_directory}/*.csv"].sort_by {|file| [file.count("/"), file]}.each {|file|
            `cat #{file} >> #{final_output_file}`
}
Run Code Online (Sandbox Code Playgroud)

我在处理期间拍摄了内存消耗快照.它几乎占用了内存的所有部分,但是,它不会失败.总是失败的cat命令.

我想,在反引号上它试图分叉一个新的进程,它没有获得足够的内存,所以它失败了.

请让我知道您的意见和替代方案.

ruby shell fork out-of-memory spawn

14
推荐指数
1
解决办法
3万
查看次数

产卵功能无需导出

我是erlang的新手,并且在以下情况下有点头疼:

拿这个代码:

-module (so).
-export ( [foo/0] ).

bar () ->
    receive 
        die -> ok;
        Msg -> io:format ("I say ~p.~n", [Msg] )
    end.


bar (Name) ->
    receive 
        die -> ok;
        Msg -> io:format ("~s says ~p.~n", [Name, Msg] )
    end.

foo () ->
    Bar = spawn (fun bar/0),
    Bar ! "Hello",
    Bar ! die,
    Baz = spawn (?MODULE, bar, ["Alice"] ), % bar/1 not exported
    Baz ! "Hello",
    Baz ! die.
Run Code Online (Sandbox Code Playgroud)

产生的过程spawn/1工作正常,但第二个过程产生了spawn/3失败,因为我没有导出bar/1,因此我得到了{undef,[{so,bar,["Alice"]}]} …

erlang export spawn

13
推荐指数
1
解决办法
1799
查看次数