Я запускаю простой Node.js процесс резервного копирования моих данных каждый день, используя child_process.execSync
для запуска:
scp -P 4422 root@myserver.com:/data/backups/dbs.zip /data/backups/dbs.zip
Обратите внимание, что если я запускаю вышеуказанную команду напрямую, она будет работать. Но когда я делаю это в Node, я получаю следующий журнал:
[2020-03-04 05:00:00] error downloading backup...Command failed:
Permission denied, please try again.
root@myserver.com: Permission denied (publickey,password).
Нужно ли мне создавать файл ключа для Node.js 'child_process, чтобы использовать его при запуске scp? Если так, то почему, если я запускаю scp -i id_rsa.pem -P 4422 root@myserver.com:/data/backups/dbs.zip /data/backups/dbs.zip
в Node.js, он просто зависает (как будто он даже останавливает выполнение любых асин c действий, таких как appendFile
. Он также создал множество процессов, называемых (node)
, и эти процессы не может быть убит.
const path = require('path');
const {
backupPath,
downloadPath
} = require('../../conf');
const keyPath = path.join(
__dirname,
'../../key/id_rsa.pem'
);
const downloadProcess = log => {
const { execSync } = require('child_process');
log('downloading backup...');
try {
const date = new Date();
const backupName = `db_${date.format('yyyy-MM-dd')}.tar.gz`;
const command = `scp -i ${keyPath} -P 4422 root@myserver.com:${backupPath}/${backupName} ${downloadPath}/${backupName}`;
log(`running command: ${command}`);
const stdout = execSync(command);
log(`downloaded backup ${backupName} at ${downloadPath}${'\n'}stdout:${'\n'}${stdout}`);
} catch (e) {
log(`error downloading backup...${e.message}`);
}
}
module.exports = downloadProcess;