Несколько повторяющихся процессов

Я тестирую несколько доменов и их способность предупреждать меня, когда происходит ненормальное событие. Я использую nmap для сканирования доменов на наличие открытых портов. Сценарий ниже открывает новое окно cmd и запускает nmap. Я ищу идентификатор процесса и проверяю, запущен ли процесс (cmd). После завершения сканирования он снова запустит сканирование nmap.

function nmaptest {
    $prog1="cmd"
    $params1=@("/C";"nmap.exe -Pn -sX 192.168.1.0/24")
    Start-Process -Verb runas $prog1 $params1 #starts
}

while(1 -eq 1){
    nmaptest
    $processes = get-process $prog1 | out-string
    $sp = $processes.Split(' ',[System.StringSplitOptions]::RemoveEmptyEntries)
    $procid = $sp[22]
    echo $procid

    while(get-process -id $procid){ }
}

Это прекрасно работает. Мне нужна помощь, чтобы выполнить этот процесс 8 раз параллельно. (если это возможно)


person Harry Singh    schedule 04.09.2015    source источник
comment
Какая у вас версия PowerShell?   -  person Piyush    schedule 04.09.2015


Ответы (1)


Ну, если нет какой-либо конкретной причины, по которой вы запускаете CMD (например, вам нужно увидеть вывод), я бы рекомендовал вместо этого использовать задания. Ими легко управлять и проверять, работают ли они.

$jobs = @()
$sx = '192.168.1.0/24', 'range2', 'etc'
For ($i = 0; $i -lt $sx.Length; $i++) { $jobs += Start-Job { nmap.exe -Pn -sX $sx[i] } }

while ($true) {
    For ($i = 0; $i -lt $sx.Length; $i++) { 
        if ($jobs[i].State -eq "Completed" {
            Write-Output ("Completed job for " + $sx[i])
            Receive-Job $jobs[i]
            $jobs[i] = Start-Job { nmap.exe -Pn -sX $sx[i] }
        } 
    }
    Start-Sleep -s 5
}
person Deadly-Bagel    schedule 04.09.2015
comment
поможет ли это запустить несколько заданий параллельно? - person Harry Singh; 04.09.2015
comment
Задания выполняются асинхронно, так что да - person Deadly-Bagel; 04.09.2015
comment
Чтобы уточнить, вышеприведенный скрипт создает задания и запускает их параллельно, затем многократно перебирает их и перезапускает завершенные. Он выполняет столько заданий, сколько вы задали ему параметров $sx. Обратите внимание, что я только что добавил сон в цикл, чтобы он не работал без необходимости. - person Deadly-Bagel; 04.09.2015
comment
есть ли способ увидеть вывод для каждого задания, чтобы убедиться, что оно работает правильно? - person Harry Singh; 04.09.2015
comment
Вы можете использовать Receive-Job $jobs[i], чтобы получить вывод для этого задания. Обновленный ответ, чтобы сделать это. - person Deadly-Bagel; 07.09.2015