我想在node.js中使用spawn执行像"doSomething ./myfiles/*.csv"这样的命令.我想使用spawn而不是exec,因为它是某种监视进程,我需要stdout输出.
我试过这个
var spawn = require('child_process').spawn;
spawn("doSomething", ["./myfiles/*.csv"]);
Run Code Online (Sandbox Code Playgroud)
但是,通配符*.csv将不会被解释.
使用spawn()时是否无法使用通配符?还有其他可能解决这个问题吗?
谢谢
托本
我正在尝试将我的Node应用程序作为Grunt任务运行.但是,我需要将其作为子进程生成,以允许我并行运行监视任务.
这有效:
grunt.registerTask('start', function () {
grunt.util.spawn(
{ cmd: 'node'
, args: ['app.js']
})
grunt.task.run('watch:app')
})
Run Code Online (Sandbox Code Playgroud)
但是,当监视任务检测到更改时,这将再次触发启动任务.在我生成我的Node应用程序的另一个子进程之前,我需要杀死前一个.
但是,我无法弄清楚如何杀死这个过程.这样的东西不起作用:
var child
grunt.registerTask('start', function () {
if (child) child.kill()
child = grunt.util.spawn(
{ cmd: 'node'
, args: ['app.js']
})
grunt.task.run('watch:app')
})
Run Code Online (Sandbox Code Playgroud)
看起来:
undefined.child没有kill功能......考虑以下C程序(test.c):
#include <stdio.h>
int main() {
printf("string out 1\n");
fprintf(stderr, "string err 1\n");
getchar();
printf("string out 2\n");
fprintf(stderr, "string err 2\n");
fclose(stdout);
}
Run Code Online (Sandbox Code Playgroud)
哪个应该打印一行到stdout,一行到stderr,然后等待用户输入,然后另一行到stdout,另一行到stderr.非常基本!在编译并在命令行上运行时,程序的输出完成(收到getchar()的用户输入):
$ ./test
string out 1
string err 1
string out 2
string err 2
Run Code Online (Sandbox Code Playgroud)
尝试使用带有以下代码的nodejs将此程序生成为子进程时:
var TEST_EXEC = './test';
var spawn = require('child_process').spawn;
var test = spawn(TEST_EXEC);
test.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
test.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
// Simulate entering data for getchar() after 1 second
setTimeout(function() { …Run Code Online (Sandbox Code Playgroud) 我产生一个脚本,从这样的Web应用程序运行很长一段时间:
os.spawnle(os.P_NOWAIT, "../bin/producenotify.py", "producenotify.py", "xx",os.environ)
Run Code Online (Sandbox Code Playgroud)
该脚本成功生成并运行,但直到它结束我无法释放Web应用程序使用的端口,或者换句话说,我无法重新启动Web应用程序.我如何产生一个过程并使其完全独立于Web应用程序?
这是在linux操作系统上.
是否有可能确保使用node.js生成的进程child_process将在父级被杀死时被终止?
这是一个示例脚本
var spawn = require('child_process').spawn;
var log_tail = spawn("tail", ["-f", "/dev/null"]);
setInterval(function() {
console.log('just chilling');
}, 10000);
Run Code Online (Sandbox Code Playgroud)
如果我查看进程树,我会看到:
$ ps faux
ubuntu 9788 0.0 0.0 73352 1840 ? S 15:04 0:00 | \_ sshd: ubuntu@pts/7
ubuntu 9789 0.0 0.2 25400 6804 pts/7 Ss 15:04 0:00 | \_ -bash
ubuntu 10149 1.0 0.2 655636 8696 pts/7 Sl+ 15:07 0:00 | \_ node test.js
ubuntu 10151 0.0 0.0 7184 608 pts/7 S+ 15:07 0:00 | \_ tail -f /dev/null
Run Code Online (Sandbox Code Playgroud)
然后我需要停止该脚本,不能ctrl-c(说我的ssh连接丢失)
$ …Run Code Online (Sandbox Code Playgroud) 当我通过Node运行时:
var spawn = require('child_process').spawn;
ls = spawn('ls', ['C:\\Users']);
ls.on('error', function (err) {
console.log('ls error', err);
});
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
ls.on('close', function (code) {
console.log('child process exited with code ' + code);
});
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ls error { [Error: spawn ENOENT] code: 'ENOENT', errno: 'ENOENT', syscall: 'spawn' }
child process exited with code -1
Run Code Online (Sandbox Code Playgroud)
在Windows Server 2012上.有什么想法吗?
我目前在一个阻塞的模块中有一个操作,所以我正在考虑把它变成一个我代替的子进程.
如果我想这样做,那么我当然需要修改我的模块的架构.该模块要求通过将模块作为函数调用来注入依赖项,并传入依赖项,如下所示:
var dependency = { name: "Bob" }
require('worker')(dependency)
Run Code Online (Sandbox Code Playgroud)
然后在我的worker模块中:
module.exports = function (dependency) {
// Outputs { name: "Bob" }
console.log(dependency)
}
Run Code Online (Sandbox Code Playgroud)
如何将此示例转换为分叉的子进程?
在观看我学习Node的在线培训视频中,讲述者说:“对于包含大量数据的较长流程而言,生成更好,而对于短数据则执行效果更好。”
为什么是这样?Node.js中child_process生成和执行函数之间有什么区别,我何时知道要使用哪个?
我可以使用multiprocessing.Processstart 方法运行后台函数fork。出于某种原因,我需要这个子进程在运行时启动一个新环境。因此,我将 start 方法设置为spawnviamultiprocessing.set_start_method('spawn')并通过运行作业job.start(),出现以下错误:
Can't pickle <class 'module'>: attribute lookup module on builtins failed
Run Code Online (Sandbox Code Playgroud)
但是,我不会在我调用的函数中使用pickle。我可能做错了什么?在spawn模式下运行进程时,是否有我应该遵循的一般经验法则?
仅供参考:我在一台装有 Ubuntu 16.04 的机器上
python multiprocessing spawn python-3.x python-multiprocessing
我已经有一段时间没有这样做了,过去我使用“spawn”来创建进程。
现在我想从我的应用程序异步启动进程,以便我的应用程序继续在后台执行,并且不会因启动进程而被阻止。
我还希望能够与启动的进程进行通信。当我启动进程时,我将向其发送启动程序进程 id,以便启动的进程可以使用其 pid 与启动程序进行通信。
我正在寻找多平台的解决方案,不特定于任何平台/操作系统的最佳使用方法是什么?
我正在用 C++ 编写此内容,我不想要将我与任何第三方许可产品联系在一起的解决方案。
我不想使用线程,解决方案必须是创建新进程。
spawn ×10
node.js ×7
process ×3
python ×2
c++ ×1
exec ×1
fork ×1
function ×1
gruntjs ×1
javascript ×1
parent-child ×1
python-3.x ×1
stdout ×1
unbuffered ×1
windows ×1