[尝试在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,但我想避免在可能的情况下使事情变得过于复杂。感谢您提供任何帮助,谢谢!
我知道了。出于任何原因,Prepare volume #2 for ‘/dev/nst0’ and hit return:
行都不会注册为粗壮事件。但是,经过进一步研究,我发现tar具有-F flag,,可让您定义在到达磁带末尾时要运行的脚本。我编写了一个简单的shell脚本,该脚本在到达磁带末尾时会回显,然后将其注册为stdout事件。这样,我就可以毫无困难地继续我的项目。现在,命令如下所示:
tar -F './tartest.sh' -cvMf /dev/nst0 '(data files here)'