Приложение молча умирает, когда открывает много SFTP-соединений.Я использую всевозможные обработчики событий process
, и срабатывает только один process.on('exit',...
Я использую пакет npm для SFTP ssh2-sftp-client
, который использует пакет ssh2
внизу.
Вот минимальный воспроизводимый код
const Client = require('ssh2-sftp-client')
const inspect = require('util').inspect
const sftpClient = new Client();
sftpClient.on('error', (err) => {
console.log('SFTP client emitted ERROR: ' + inspect(err))
})
sftpClient.on('end', () => {
console.log('SFTP client emitted END')
})
sftpClient.on('finish', () => {
console.log('SFTP client emitted FINISH')
})
sftpClient.on('close', () => {
console.log('SFTP client emitted CLOSE')
})
const options = {
host: '',
port: '22',
username: '',
password: ''
};
// below infinite loop is to simulate large number of
// connections in my production code
(async () => {
while (true) {
try {
await new Promise(resolve => setTimeout(() => resolve(sftpClient.connect(options)), 1000))
} catch {
console.log('boom')
}
}
})()
process.on('exit', code => console.log(`Catched!. Exit code: ${code}`))
process.on('uncaughtException', (err, origin) => {
console.error('Unhandled exception. Please handle!', err.stack || err)
console.error(`Origin: ${JSON.stringify(origin)}`)
})
process.on('unhandledRejection', (err, promise) => {
console.error('Unhandled promise rejection. Please handle!', promise, err.stack || err)
})
process.on('warning', (warning) => {
console.warn(warning.name)
console.warn(warning.message)
console.warn(warning.stack)
})
process.on('rejectionHandled', (promise) => {
console.log('rejectionHandled event triggered')
})
Как видите, он не должен выходить из бесконечного цикла, пока не возникнет ошибка.И это на самом деле не для некоторых итераций, но в конечном итоге он ускользает (обычно после <10 итераций) </em>.И единственный журнал, который я вижу, это
SFTP client emitted END
Catched!. Exit code: 0
На стороне сервера SFTP у меня есть следующие ограничения в sshd_config
файле
MaxSessions 1
MaxStartups 1
, который я использую:
- Node.js 12
- ssh2-sftp-client 4.1.0
Вкратце, вопрос:
КакУзел может аварийно завершить работу без каких-либо событий ошибок / стековых трасс и кода выхода 0 ?
Обновление # 1
В комментариях было рекомендовано сделатьосновной дамп процесса и анализ его.
Как сделать дамп ядра при коде выхода 0?
Если я сделаю дамп ядра, что мне там искать?
Обновление # 2
Создана проблема в хранилище https://github.com/theophilusx/ssh2-sftp-client/issues/168