events.js:72
throw er; // Unhandled 'error' event
^
Error: spawn ENOENT
at errnoException (child_process.js:1000:11)
at Process.ChildProcess._handle.onexit (child_process.js:791:34)
Run Code Online (Sandbox Code Playgroud)
作者说明:此错误的许多问题鼓励我发布此问题以供将来参考.
相关问题:
为了学习Angular 2,我正在尝试他们的教程.
我收到这样的错误:
(node:4796) UnhandledPromiseRejectionWarning: Unhandled promise rejection (r ejection id: 1): Error: spawn cmd ENOENT
[1] (node:4796) DeprecationWarning: Unhandled promise rejections are deprecated.
In the future, promise rejections that are not handled will terminate the Node.
js process with a non-zero exit code.
Run Code Online (Sandbox Code Playgroud)
我在SO中经历了不同的问题和答案,但无法找出"未处理的承诺拒绝"是什么.
任何人都可以简单地解释一下它是什么Error: spawn cmd ENOENT
,也是什么,当它出现时,我必须检查以摆脱这个警告?
我有一个脚本输出'hi',睡眠一秒,输出'hi',睡眠1秒,依此类推.现在我想我可以用这个模型来解决这个问题.
var spawn = require('child_process').spawn,
temp = spawn('PATH TO SCRIPT WITH THE ABOVE BEHAVIOUR');
temp.stdout.pipe(process.stdout);
Run Code Online (Sandbox Code Playgroud)
现在的问题是需要完成任务才能显示输出.正如我所理解的那样,这是因为新生成的进程需要执行控制.显然node.js不支持线程所以任何解决方案?我的想法是可能运行两个实例,第一个用于创建任务的特定目的,并将输出管道输出到第二个实例的进程,考虑到这可以实现.
由于在使用spawn时抛出了ENOMEM(内存不足)错误,我的Node.js脚本崩溃了.
错误:
child_process.js:935
throw errnoException(process._errno, 'spawn');
^
Error: spawn ENOMEM
at errnoException (child_process.js:988:11)
at ChildProcess.spawn (child_process.js:935:11)
at Object.exports.spawn (child_process.js:723:9)
at module.exports ([...]/node_modules/zbarimg/index.js:19:23)
Run Code Online (Sandbox Code Playgroud)
我已经在error
和exit
事件中使用了侦听器,但是如果出现此错误,则不会触发它们.
我的代码:
zbarimg = process.spawn('zbarimg', [photo, '-q']);
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... });
Run Code Online (Sandbox Code Playgroud)
完整源代码可用.
有什么办法可以防止脚本崩溃吗?如何捕获抛出的ENOMEM错误?
谢谢!
我们开发人员编写的大多数应用程序都需要在启动时进行外部参数化.我们传递文件路径,管道名称,TCP/IP地址等.到目前为止,我一直在使用命令行将这些传递给正在启动的应用程序.我不得不解析命令行main
并将参数指向他们需要的地方,这当然是一个很好的设计,但很难维护大量的参数.最近我决定使用环境变量机制.它们是全局的,可以从任何地方访问,从架构的角度来看不太优雅,但限制了代码量.
这些是我对这两种策略的第一次(也可能是很浅的)印象,但我想听听更多有经验的开发人员的意见 - 使用环境变量和命令行参数将参数传递给进程的起伏是什么?我想考虑以下事项:
备注:
广告.这是我感兴趣的主要方面.
广告.这有点务实.据我所知,这是目前在Windows上一定的局限性巨大(超过32kB的两个命令行和环境块).我想这不是问题,因为如果需要,你应该使用一个文件来传递大量的参数.
广告.我几乎不知道Unix,所以我不确定这两种策略是否像在Windows上一样可用.如果你愿意,请详细说明.
command-line process environment-variables argument-passing spawn
我试图spawn
实现一个rm -rf node_modules
跟随npm install
(在Windows 7; n x命令由透明安装的CygWin提供.所有n x命令在命令行上解析就好了).
我最初使用它exec
,但想要捕获stdout/stderr信息,因此我想我会使用spawn
,并重写代码使用它.然而,这打破了一切.
rm
重写的命令变为:
var spawn = require("child_process").spawn,
child = spawn("rm", ["-rf", "node_modules"]);
child.stdout.on('data', function (data) { console.log(data.toString()); });
child.stderr.on('data', function (data) { console.log(data.toString()); });
child.on('error', function() { console.log(arguments); });
Run Code Online (Sandbox Code Playgroud)
但是,运行它会生成以下错误:
rm: unknown option -- ,
Try `rm --help' for more information.
Run Code Online (Sandbox Code Playgroud)
npm
重写的命令变为:
var spawn = require("child_process").spawn,
child = spawn("npm", ["install"]);
child.stdout.on('data', function (data) { console.log(data.toString()); });
child.stderr.on('data', function (data) { …
Run Code Online (Sandbox Code Playgroud) 我觉得我错过了什么.
这是我想要实现的目标:
有一个执行我的grunt任务server.js
并且watch
并行运行任务.我觉得这正是grunt设计的任务之一,但我无法实现这种配置.
其中,我读过这个: 通过Grunt运行Node应用程序, 但我仍然无法做到.
这是我的Gruntfile.js:
module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
watch: {
scripts: {
files: ['*.js'],
tasks: ['start'],
options: {
nospawn: true
}
}
}
});
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.registerTask('start', function() {
grunt.util.spawn({
cmd: 'node',
args: ['server.js']
});
grunt.task.run('watch');
});
grunt.registerTask('default', 'start');
};
Run Code Online (Sandbox Code Playgroud)
我"grunt-contrib-watch": "~0.3.1"
应该是比grunt-contrib-watch@0.3.0
前面提到的帖子更高的版本.
如果你能帮助我实现正确的配置,我将非常感激.但更多的是,我不明白为什么没有正式的grunt-contrib-nodemon-like
包装和任务,因为我觉得使用grunt是另一个很好的理由(我真的很喜欢它作为工具!)
谢谢
当我尝试构建(模拟)Cordova应用程序时,在Windows cmd中获取此错误.
D:\dev\Cordova\toDoList>cordova build android
Running command: D:\dev\Cordova\toDoList\platforms\android\cordova\build.bat
events.js:85
throw er; // Unhandled 'error' event
^
Error: spawn cmd ENOENT
at exports._errnoException (util.js:746:11)
at Process.ChildProcess._handle.onexit (child_process.js:1046:32)
at child_process.js:1137:20
at process._tickCallback (node.js:355:11)
ERROR building one of the platforms: Error: D:\dev\Cordova\toDoList\platforms\android\cordova\build.bat: Command failed with exit code 1
You may not have the required environment or OS to build this project
Run Code Online (Sandbox Code Playgroud) 我是对应用程序执行spawn(子进程)的节点应用程序,应用程序有主机和端口:
var exec = require('child_process').spawn;
var child = exec('start app');
console.log("Child Proc ID " + child.pid)
child.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
child.stderr.on('data', function(data) {
console.log('stdout: ' + data);
});
child.on('close', function(code) {
console.log('closing code: ' + code);
});
Run Code Online (Sandbox Code Playgroud)
一些应用程序将立即启动,一些应用程序将需要一些时间10 - 20秒,直到它们启动.
现在我使用节点http代理来运行应用程序,问题是当用户想要在应用程序启动并运行之前运行应用程序时出现错误.知道我怎么能解决这个问题?
proxy.on('error', function (err, req, res) {
res.end('Cannot run app');
});
Run Code Online (Sandbox Code Playgroud)
顺便说一句,由于我们的框架限制,我无法在代理错误中发送响应500.任何其他想法我如何跟踪应用程序可能会有一些超时,以查看它发送响应的天气200.
更新 - 我的逻辑样本
httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({});
http.createServer(function (req, res) {
console.log("App proxy new port is: " + 5000) …
Run Code Online (Sandbox Code Playgroud) 我有一些Python代码偶尔需要跨越一个新进程来以"一劳永逸"的方式运行shell脚本,即没有阻塞.shell脚本不会与原始Python代码通信,实际上可能会终止调用Python进程,因此启动的shell脚本不能是调用Python进程的子进程.我需要它作为一个独立的过程启动.
换句话说,假设我有mycode.py并启动script.sh.然后mycode.py将继续处理而不会阻塞.脚本script.sh将独立完成一些操作,然后实际停止并重新启动mycode.py.因此运行script.py的进程必须完全独立于mycode.py.我怎么能这样做?我认为subprocess.Popen不会阻塞,但仍然会创建一个子进程,一旦mycode.py停止就会终止,这不是我想要的.
spawn ×10
node.js ×7
javascript ×3
angular ×1
cmd ×1
command-line ×1
cordova ×1
daemon ×1
debugging ×1
es6-promise ×1
exec ×1
fork ×1
gruntjs ×1
process ×1
python ×1
subprocess ×1
try-catch ×1
watch ×1