Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как выполнять второй цикл только после завершения exec, не блокируя интерпретатор?

Dlazder Мудрец (16875), на голосовании 1 год назад
async function run() {
for (const host of hosts) {
const output = await exec(`nmap -p- ${host} -T 5`)
const result = output.toString()
console.log(result)
console.log('============');
const ports = result.match(/\d+\//g)
console.log(ports);
//Отправляем запросы на каждый порт хоста
for (const port of ports) {
await axios.get(`http://${host}:${port}`, {timeout: 5000})
.then(res => console.log(host, res.status))
.catch(err => console.log(`${host}:${port} | ERROR`))
}
}
}
run()
Мне нужно второй цикл запускать на каждой итерации, начинать следующую итерацию внешнего цикла только после полного завершения внутреннего. Заранее спасибо!
Голосование за лучший ответ
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (264137) 1 год назад
Логика такая , не проверял

 async function run() { 
for (const host of hosts) {
const output = await exec(`nmap -p- ${host} -T 5`);
const ports = output.toString().match(/\d+\//g) || [];

console.log(output);
console.log('============');
console.log(ports);

await Promise.all(ports.map(async (port) => {
try {
const res = await axios.get(`http://${host}:${port}`, { timeout: 5000 });
console.log(host, res.status);
} catch (err) {
console.log(`${host}:${port} | ERROR`);
}
}));
}
}

run();
DlazderМудрец (16875) 1 год назад
Не робит че то... В output моментально попадает null...

ports:
null
/data/data/com.termux/files/home/scan/scan2.js:17
await Promise.all(ports.map(async (port) => {
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (264137) а... ну, надо зависимости установить и подключить
 const axios = require('C:\\Windows\\System32\\node_modules\\axios\\dist\\node\\axios.cjs'); 
const exec = require('child_process').exec; 
 
async function run() { 
  const host = '74.125.131.100'; 
  const ports = [80]; 
 
  const output = await exec(`nmap -p- ${host} -T 5`); 
 
  const promises = ports.map(port => axios.get(`http://${host}:${port}`, { timeout: 5000 })); 
 
  const results = await Promise.all(promises); 
 
  for (const result of results) { 
    console.log(host, result.status); 
  } 
} 
 
run(); 
Semen Kapacuk Гуру (3750) 1 год назад
Пользуйся, пожалуйста, кнопкой "Блок кода" ( <> ), читать код в таком виде неприемлемо
DlazderМудрец (16875) 1 год назад
Компа под рукой нет, попробуй с телефона вставить)))
Саня Семенов Оракул (60497) 1 год назад
после завершения exec, не блокируя интерпретатор - либо выполняешь последовательно и ждешь пока дойдет очередь но при этом интерпретатор блокируется либо выполняешь параллельно но тогда нельзя использовать await и сложно отследить когда что выполнилось
DlazderМудрец (16875) 1 год назад
Я хочу просто после выполнения exec прогнать второй цикл и отправить запросы, дальше можно начинать новую итерацию внешнего цикла
DlazderМудрец (16875) 1 год назад
Как это сделать? Я туплю, обычный exec асинхронный, как и гет запросы, не знаю как поочереди все отправлять
Саня Семенов Оракул (60497) Dlazder, а как тебе в итоге надо синхронно или асинхронно ? синхронно это так как у тебя асинхронно это вытащить тело цикла в отдельную функцию сделать ее async убрать await и передавать идентификатор запроса чтобы в момент когда дойдет очередь понимать какой это запрос выполнился сейчас пс итак будет отлично работать но позже тебе потребуется очередь а чтобы затолкать в очередь асинхронные запросы надо использовать Promise
DlazderМудрец (16875) 1 год назад
Если просто асинхронно выполнять exec в цикле, то будет неприятная ситуация в виде массива hosts в 300 элементов, все просто крашнется. максимум можно несколько запустить. Поэтому мне нужно чтобы нмап выполнился, отдал свой вывод — парсим его и отправляем гет запросы циклом, получаем логи, все, итерация главного цикла завершена. Можете помочь с кодом? А то я и так и сяк эти промисы кручу, оборачиваю но работать не хочет...
Похожие вопросы