我正在学习编写TCL(期望)脚本,我注意到一些示例显示使用spawn,而其他示例显示命令exec.我试过谷歌搜索,但找不到有什么区别?
假设我在一个长期预期脚本的中间调用'exec',我可以期待发生什么?
我正在阅读python 文档中对两者的描述:
产卵
父进程启动一个新的 python 解释器进程。子进程将只继承运行进程对象 run() 方法所需的资源。特别是,父进程中不必要的文件描述符和句柄将不会被继承。与使用 fork 或 forkserver 相比,使用此方法启动进程相当慢。[在 Unix 和 Windows 上可用。Windows 和 macOS 上的默认设置。]
叉子
父进程使用 os.fork() 来派生 Python 解释器。子进程在开始时实际上与父进程相同。父进程的所有资源都由子进程继承。请注意,安全地分叉多线程进程是有问题的。[仅在 Unix 上可用。Unix 上的默认设置。]
我的问题是:
我催生了下面的孩子: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将日志流式传输到浏览器中)没有帮助,因此我决定寻求一些值得关注的赏金.
我需要从中生成一个子进程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- 它的作用是有意的.
我在这做错了什么?
我使用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) 我在节点中生成一个进程并跟踪命令的输出,如下所示:
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.通常这只是一行,它还在响应之前和之后添加换行符.有没有办法让数据输出看起来像标准运行,即逐行?
我遇到了子进程模块的问题,特别是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.有什么建议?
我想自动创建和提取密钥库.我面临的问题是如何使用' |来加入命令 '符号或类似的解决方案.
//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) 我有一个正在运行的工作,它处理xml文件.xml文件大约为4k,大小为8到9 GB.
处理完毕后,我们将CSV文件作为输出.我有一个cat命令,它将所有CSV文件合并到我得到的单个文件中:
Errno :: ENOMEM:无法分配内存
on cat(Backtick)命令.
以下是一些细节:
使用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命令.
我想,在反引号上它试图分叉一个新的进程,它没有获得足够的内存,所以它失败了.
请让我知道您的意见和替代方案.
我是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"]}]} …