将tar命令作为Node.js中的child_process运行

问题描述 投票:0回答:1

[尝试在node.js中使用child_process.spawn来运行tar命令时,运行时失败,并显示ENOENT错误。如果我以child_process.exec身份运行,该命令将运行并通过exec.stdout.on('data')事件处理程序返回一行输出。在终端中运行命令时,其输出比exec返回的输出更多。

关键问题是,带有标志-cvMf的tar要求用户按Enter才能继续其过程,我希望通过exec.send来完成此过程

这里是我的代码摘录:

 try {
  let subprocess = exec('tar -cvMf /dev/nst0 /mnt/Data/2GBdata1 /mnt/Data/1GBdata');

  subprocess.stdout.on('data', function (data)  {
    console.log('stdout on data: \n', data.toString());
  });
  subprocess.on('data', function(data)  {
    console.log('on data: \n', data);
  })
  subprocess.stdout.on('message', function (message)  {
    console.log('sub messgae: ', message);
  });
  subprocess.stderr.on('error', function(err) {
    console.log('sub error thrown', err);
    throw err;
  })
  subprocess.on('exit', function (data)  {
    subprocess = null;
    console.log('sub exited: \n', data);
  });

}
catch (err) {
  console.error(`exec error: ${err}`);
  output = `${err}`;
}

输出很简单:

 stdout on data: 
 /mnt/Data/2GBdata1

stdout on data: 
 /mnt/Data/1GBdata

然后该过程只是挂起。预期的输出(在终端中运行命令时)如下:

tar -cvMf /dev/nst0 /mnt/Data/2GBdata /mnt/Data/1GBdata
tar: Removing leading `/' from member names
/mnt/Data/2GBdata
/mnt/Data/1GBdata
Prepare volume #2 for ‘/dev/nst0’ and hit return: 

我的最后一个选择是编写一个shell脚本并使用execFile,但我想避免在可能的情况下使事情变得过于复杂。感谢您提供任何帮助,谢谢!

node.js linux tar
1个回答
0
投票

我知道了。出于任何原因,Prepare volume #2 for ‘/dev/nst0’ and hit return:行都不会注册为粗壮事件。但是,经过进一步研究,我发现tar具有-F flag,,可让您定义在到达磁带末尾时要运行的脚本。我编写了一个简单的shell脚本,该脚本在到达磁带末尾时会回显,然后将其注册为stdout事件。这样,我就可以毫无困难地继续我的项目。现在,命令如下所示:

tar -F './tartest.sh' -cvMf /dev/nst0 '(data files here)'
© www.soinside.com 2019 - 2024. All rights reserved.