标签: spawn

无法使用交互式脚本获取 child_process.spawn 的输出

我无法在以下代码中获得任何输出:

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>”,以便稍后可以将某些内容输入到标准输入中。

问题是我在数据事件中什么也没有得到,而且似乎这些事件都没有被触发。

spawn child-process node.js

5
推荐指数
1
解决办法
2317
查看次数

带有期望生成的管道输出

我有通过 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 bash expect spawn

5
推荐指数
1
解决办法
6264
查看次数

节点生成 std​​out.on 数据延迟

我正在检查 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”来查看会发生什么。移除并重新插入几次,最终节点将打印出来。

linux pipe spawn node.js

5
推荐指数
1
解决办法
1720
查看次数

sshpass 命令在 Node.js 中不起作用

我尝试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)

spawn node.js sshpass

5
推荐指数
0
解决办法
1109
查看次数

为什么 Nodejs 生成进程会变成 <defunct> 直到父进程退出

我们先来看看这个现象

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

zombie-process spawn defunct node.js

5
推荐指数
1
解决办法
2317
查看次数

在 Windows 上生成带有 child_process 的 NodeJs 脚本,为什么我需要“shell: true”来解决 ENOENT 错误?

我正在使用这段代码:

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)

这是正确的?

shell cmd spawn child-process node.js

5
推荐指数
1
解决办法
4455
查看次数

电子包装器生成 ENOENT

我正在开发一个通过 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)

javascript spawn electron enoent electron-packager

5
推荐指数
1
解决办法
4271
查看次数

Firebase Cloud 函数生成缩略图时出错:spawn conversion ENOENT

更新前云功能运行良好。这是现在发生错误的代码:

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

5
推荐指数
1
解决办法
510
查看次数

响应 child_process spawn nodejs 中的密码查询

需要帮助弄清楚这一点。

我试图通过子进程 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)

spawn child-process node.js ubuntu-16.04

5
推荐指数
0
解决办法
616
查看次数

使用 ipc 的 Windows 上的节点 child_process.spawn 错误文件描述符

我正在尝试通过 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)

这种情况仅发生在特殊配置中:

  1. 在窗户上
  2. 带“ipc”选项
  3. js中的spawned命令
    会失败:another.jsnpm
    不会失败:node

有一个已关闭的问题,没有多大用处。

shell: true根据这篇文章,我需要跨平台兼容性。

这个问题似乎也相关,但读完后我并没有变得更聪明。

节点 v12.18.3

感谢帮助。

windows ipc spawn child-process node.js

5
推荐指数
1
解决办法
1303
查看次数