我无法在以下代码中获得任何输出:
var spawn = require('child_process').spawn,
script = 'ftp',
child = spawn(script);
child.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
child.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
child.on('close', function (code) {
console.log('child process exited with code ' + code);
});
Run Code Online (Sandbox Code Playgroud)
它适用于普通脚本,如“ls”、“pwd”等。但不适用于交互式程序,如“ftp”、“telnet”。有什么建议么?
编辑:
以另一个脚本为例:
#!/usr/bin/env python
name = raw_input("your name>")
print name
Run Code Online (Sandbox Code Playgroud)
当生成此脚本时,我希望使用数据事件获取提示“your name>”,以便稍后可以将某些内容输入到标准输入中。
问题是我在数据事件中什么也没有得到,而且似乎这些事件都没有被触发。
我有通过 ssh 将一些文件复制到其他服务器的脚本。我正在使用 tar 将文件压缩到 farchive 并从其他计算机上的 stdout 解压缩。
set timeout -1
# user info
set port [lindex $argv 0]
set login [lindex $argv 1]
set password [lindex $argv 3]
set host [lindex $argv 2]
#tar info
set sdir [lindex $argv 4]
set ddir [lindex $argv 5]
spawn tar cf - $sdir | ssh -p $port $login@$host tar xf - -C $ddir
expect "*?(yes/no)" {
send "yes\r"
}
expect "*?assword" {
send "$password\r"
}
expect "#" {
send "ls $ddir …Run Code Online (Sandbox Code Playgroud) 我正在检查 Linux 上的 USB 驱动器删除情况。我只是使用 child_process.spawn 监视命令行进程的输出。但由于某种原因,直到打印了 20 行之后,子进程的 stdout 数据事件才会发出,这使得它无法检测到已删除的驱动器。多次卸下驱动器后,它终于消失了。但显然这不行。
原来的:
var udevmonitor = require("child_process").spawn("udevadm", ["monitor", "--udev"]);
udevmonitor.stdout.on("data", function(data) {
return console.log(data.toString());
});Run Code Online (Sandbox Code Playgroud)
很简单。所以我认为这是内部使用的管道节点的问题。因此,我想我不会使用管道,而是使用一个简单的直通流。这可以解决问题并给我实时输出。该代码是:
var stdout = new require('stream').PassThrough();
require("child_process").spawn("udevadm", ["monitor", "--udev"], { stdio: ['pipe', stdout, 'pipe'] });
stdout.on("data", function(data) {
console.log(data.toString());
});Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误: child_process.js:922 throw new TypeError('Stdio 流的值不正确: ' + stdio);
文档说你可以传入一个流。我不明白我做错了什么,单步执行 child_process 源没有帮助。
有人可以帮忙吗?如果您使用的是 Linux,您可以自己运行它。运行代码并插入 USB 驱动器。也许您可以在另一个终端中运行命令“udevadm monitor --udev”来查看会发生什么。移除并重新插入几次,最终节点将打印出来。
我尝试sshpass使用 node.js spawn() 运行命令来自动化 ssh。但它会自动从命令行退出,没有任何错误。这是我使用的代码。
var tail = spawn("sshpass", ["-p", "test", "ssh", "-n", "test@xxx.x.xxx.xxx", "'cat testfile'"]);
tail.stdout.on("data", function(data) {
readData(data);
});
Run Code Online (Sandbox Code Playgroud) 我们先来看看这个现象
Nodejs代码:
const cp = require('child_process');
var ls = cp.spawn('ls', ['/']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process closed with code ${code}`);
});
while(true){}
Run Code Online (Sandbox Code Playgroud)
运行这个nodejs代码,没有显示任何内容,似乎没有触发任何事件。
然后在另一个shell中运行“ps -ef | grep ls | grpe -v grep”,结果是:
liyuanq+ 10995 10990 0 11:06 pts/3 00:00:00 [ls] <defunct>
Run Code Online (Sandbox Code Playgroud)
如果删除代码:
while(true){}
Run Code Online (Sandbox Code Playgroud)
节点进程退出,并触发on data事件。
问题是为什么节点在实际完成其工作时不关闭生成的进程,直到父节点进程退出。
我的环境:
操作系统:Debian 8.4 x86_64
节点:v6.1.0
我正在使用这段代码:
const {
spawn
} = require('child_process');
let info = spawn('npm', ["-v"]);
info.on('close', () => {
console.log('closed');
}
Run Code Online (Sandbox Code Playgroud)
但我有这个错误:
events.js:182
throw er; // Unhandled 'error' event
^
Error: spawn npm ENOENT
at exports._errnoException (util.js:1022:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:189:19)
at onErrorNT (internal/child_process.js:366:16)
at _combinedTickCallback (internal/process/next_tick.js:102:11)
at process._tickCallback (internal/process/next_tick.js:161:9)
at Function.Module.runMain (module.js:607:11)
at startup (bootstrap_node.js:158:16)
at bootstrap_node.js:575:3
Run Code Online (Sandbox Code Playgroud)
如果我使用:
let info = spawn('npm', ["-v"], {shell: true});
Run Code Online (Sandbox Code Playgroud)
有用!
但为什么我需要shell: true?我还需要查看该生成的标准输出,所以我也使用这个:
let info = spawn('npm', ["-v"], {shell: true, stdio: 'inherit'});
Run Code Online (Sandbox Code Playgroud)
这是正确的?
我正在开发一个通过 gui 控制 gulp 任务的电子应用程序。您单击一个任务,它就会运行。很简单的东西。在 macOS 上,当我运行 npm start 时,它运行得很好,但是当我用 electro-packager 打包它时,出现以下错误:
Uncaught Exception:
Error: spawn gulp ENOENT
at exports._errnoException (util.js:1022:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:193:32)
at onErrorNT (internal/child_process.js:359:16)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
Run Code Online (Sandbox Code Playgroud)
这是代码:
exports.runTask = (taskName, projPath) => {
const cp = spawn('gulp', [ taskName ], {cwd: projPath});
cp.stdout.setEncoding('utf8');
cp.stdout.on('data', data => {
console.log(data);
mainWindow.webContents.send('task-console-data', data);
});
cp.stderr.setEncoding('utf8');
cp.stderr.on('data', data => {
console.error(data);
displayNotification({text: `[error] ${data}`});
mainWindow.webContents.send('task-console-data', `[error] ${data}`);
});
cp.on('exit', code => {
if (code === 0) { …Run Code Online (Sandbox Code Playgroud) 更新前云功能运行良好。这是现在发生错误的代码:
return spawn('convert' ,[tempLocalFile, '-thumbnail', `${THUMB_MAX_WIDTH}x${THUMB_MAX_HEIGHT}`, tempLocalThumbFile], {capture: ['stdout', 'stderr']});
Run Code Online (Sandbox Code Playgroud)
以下是错误的详细信息:
generateThumbnail Error: {
Error: spawn convert ENOENT at _errnoException
(util.js:1022:11) at Process.ChildProcess._handle.onexit
(internal/child_process.js:190:19) at onErrorNT
(internal/child_process.js:372:16) at _combinedTickCallback
(internal/process/next_tick.js:138:11) at process._tickDomainCallback
(internal/process/next_tick.js:218:9)
code: 'ENOENT',
errno: 'ENOENT',
syscall: 'spawn convert',
path: 'convert',
spawnargs: [
'/tmp/images/E32NIXQKgVUxjUGDmPkr_aaaa',
'-thumbnail',
'400x220',
'/tmp/images/thumb_E32NIXQKgVUxjUGDmPkr_aaaa'
]
}
Run Code Online (Sandbox Code Playgroud)
是我做错了什么还是这是 firebase 云错误?
imagemagick spawn firebase imagemagick-convert google-cloud-functions
需要帮助弄清楚这一点。
我试图通过子进程 spawn 调用外部应用程序,并在调用该应用程序后要求输入密码。然后我得到一个致命错误并且子进程退出。我已经尝试了几种不同的组合来放置 child.stdin.write('somepassword\n') 但我得到了同样的错误。我认为这与应用程序没有将孩子视为终端有关。
示例代码:
const { spawn } = require('child_process');
const child = spawn('./some-app',[arguments],{shell:true});
// process.stdin.pipe(child.stdin)
child.stdin.write('testpw\n'); // has no effect
child.stdout.on('data', (data) => {
console.log(`child stdout:\n${data}`);
//child.stdin.write('testpw\n'); // no effect here either
});
child.stdin.end();
child.stderr.on('data', (data) => {
console.error(`child stderr:\n${data}`);
});
child.on('exit', function (code, signal) {
console.log('child process exited with ' +
`code ${code} and signal ${signal}`);
});
Terminal Output
> node spawn.js
child stdout:
Enter password: Fatal error:
Unix.Unix_error(Unix.ENOTTY, "tcgetattr", "")
child process exited with …Run Code Online (Sandbox Code Playgroud)我正在尝试通过 child_process spawn 在带有 ipc 选项的节点中生成命令。
我所说的:
const {spawn} = require('child_process');
const cmd = spawn('npm', ['-v'], {
shell: true,
stdio: ['inherit', 'inherit', 'inherit', 'ipc']
});
cmd.on('message', (msg) => console.log(msg));
Run Code Online (Sandbox Code Playgroud)
我得到什么:
child_process.js:122
p.open(fd);
Error: EBADF: bad file descriptor, uv_pipe_open
Child (child_process.js:122:5)
at setupChildProcessIpcChannel (internal/bootstrap/pre_execution.js:329:30)
at prepareMainThreadExecution (internal/bootstrap/pre_execution.js:54:3)
at internal/main/run_main_module.js:7:1 {
errno: -4083,
code: 'EBADF',
syscall: 'uv_pipe_open'
}
Run Code Online (Sandbox Code Playgroud)
这种情况仅发生在特殊配置中:
another.js,npmnode有一个已关闭的问题,没有多大用处。
shell: true根据这篇文章,我需要跨平台兼容性。
这个问题似乎也相关,但读完后我并没有变得更聪明。
节点 v12.18.3
感谢帮助。