Запуск декількох одночасних фонових процесів, потім зачекайте, поки всі вони припиняться в Windows


14

Хто-небудь знає, чи є сценарій cmd, який робить це та / або інструмент командного рядка готовий до роботи?


Це може завдати шкоди вашим даним!
Сантош Кумар

8
@Santosh: що ви маєте на увазі під "може нашкодити вашим даним"? У моєму конкретному випадку фонові завдання оброблять власні незалежні набори даних. Немає ризиків одночасних модифікацій.
Серхіо

1
З боку Win32 API, я думаю, що WaitForMultipleObjects з bWaitAll = TRUE зробив би цю роботу. Було б не важко написати програму, яка просто розщеплює програми, подані в якомусь вхідному файлі, якщо відповідей не буде.
користувач1686

1
@grawity: так, я планую зробити лише те, якщо нічого не з’явиться (і опублікуйте код тут), але давайте подивимось, чи зможу я уникнути винахідництва колеса :)
Серхіо,

Відповіді:


10

Створіть три пакетні файли нижче. Main.bat запускає 1.bat та 2.bat

1.bat і 2.bat виписують тимчасові файли, на які main.bat перевіряє. Поки 1.bat і 2.bat працюють, main.bat повідомляє, що обробка все ще відбувається. Якщо натиснути клавішу Enter у відкритому вікні 1.bat або 2.bat, тимчасовий файл видаляється, а програма виходить. Це імітує зупинку обробки для цього файлу .bat. Якщо ви робите це як для 1, так і для 2.bat, main.bat повідомляє вам, що обробка завершена для цих процесів. Ви можете змусити 1.bat і 2.bat робити все, що завгодно, доки ви очистите тимчасовий файл, коли закінчите. На цьому етапі main.bat може робити все, що завгодно, а також.

1.бат

echo %time% > 1.tmp
pause
del 1.tmp
exit 

2.бат

echo %time% > 2.tmp
pause
del 2.tmp
exit

main.bat

@echo off
start "1" 1.bat
start "2" 2.bat
    @ping -n 1 127.0.0.1 > nul
:loop
@echo Processing......
if not exist *.tmp goto :next
    @ping -n 5 127.0.0.1 > nul
goto loop
:next
@echo Done Processing!

Зробивши це раніше, я можу сказати вам, що такий підхід не такий складний, як здається. Крім того, його легко обслуговувати - розширювати та додавати логіку, а також легко навчити когось іншого його підтримувати. Зазвичай ці речі забирають життя самостійно ...
RobW

Я задоволений цим рішенням.
користувач1068446

Чи можете ви розгорнути команду @ping? Я не розумію, чому ви вирішили це зробити і що таке 127.0.0.1.
Джо

6

Досить просто, за умови, що процеси не потребують стандартного вводу або виводу. З командного рядка або в пакетному файлі:

process1 | process2 | process3 | process4

Це запустить усі чотири процеси одночасно і не повернеться до тих пір, поки всі вони не завершиться. (Можливий виняток: якщо процес явно закриває стандартний висновок, він може трактуватися так, як ніби він вийшов. Але це незвично, це робить дуже мало процесів.)

Я не впевнений, скільки саме процесів можна запустити одночасно таким чином. Я пробував до десяти.


Гм, я розумію, що всі процеси справді запускаються одразу, але процес3 триває в очікуванні, поки процес4 не завершиться, процес2 буде чекати, поки процес3 не завершиться тощо. Це, до речі, з класичного командного рядка Windows.
Серхіо

@Sergio: Що ви розумієте під терміном "постійно чекаю"?
Гаррі Джонстон

1

Єдиний спосіб зробити це - запустити окремі пакетні файли (див. start /?), Які виконують окремі завдання та записати текстовий файл після завершення. Потім ви періодично перевіряєте, чи були створені текстові файли.


0

Ви можете подивитися на командлет Powershell Start-Job. Це повинно дозволити вам це зробити. Більше тут Powershell - це оболонка Microsoft на вибір. Це набагато більш потужне, ніж сценарії cmd і добре спрямовує інвестиції вашого часу


Це не чекає, коли всі вони припиняться?
Тамара Війсман

Це, безумовно, може залежати від того, як ви це пишете. Ви можете опитувати розпочаті завдання, щоб побачити, чи завершено вони та вийти із сценарію, як тільки вони з’являться. Код на цій сторінці обробляє цілий список завдань, три за один раз і чекає, коли вони вийдуть.
uSlackr

Гм, ніколи раніше нічого не робив з Пауершеллом. Я спробував змінити приклад, щоб запустити довільні процеси і чекати, коли вони завершаться, і приблизно через 30 хвилин і 100 пошуків на M $ technet я відмовився. Мені шкода, якщо я когось болю почуваю, але Пауершелл - лайно. Простіше зробити це на C (що, на мою думку, розповідає ...) Спасибі все одно, я вважаю, що хтось таки знайде це корисним.
Серхіо

Якщо є одне, що Powershell - це не лайно, і ти не зашкодиш моїм почуттям, якщо ти не використаєш його. Однак ви цього не дізнаєтесь за 30 хвилин пошуку.
uSlackr

1
PowerShell - це не лайно, це лише повна мова програмування, яку треба вивчити, а не традиційний sh-подібний синтаксис. Я пам’ятаю, що почувався точно так само, як щодо Perl, Python, Tcl, C # та будь-якої іншої мови, яку я намагався навчитись «за лулз» без реального використання. (Коли мені насправді вони потрібні були, це пройшло досить легко.)
user1686

0

Або ви можете скористатися цим: http://www.out-web.net/?p=167

Я це зробив, він працює, однак іноді трапляється, що PID завершеного процесу негайно використовується повторно іншим запущеним процесом Windows, який робить виявлення кінця вашого процесу небезпечним / помилковим.


2
Підкажіть, будь ласка, що говорить про це посилання. Якщо сторінка знизиться, ця відповідь не буде корисною.
Кевін Панько

Дуже пізно здається.
Роберт Масса

0

Я також шукав подібне завдання. Завдання полягала в тому, щоб запустити паралельно декілька команд та отримати вихід (stdout & error) всіх паралельних процесів. Потім зачекайте, поки всі паралельні процеси завершаться і виконайте іншу команду. Далі наведено зразок коду для файлу BAT, який може бути виконаний у CMD:

( start "" /B cmd /c ping localhost -n 6 ^>nul timeout /t 5 /nobreak start "" /B /D "C:\users\username\Desktop" cmd /c dir ^> dr.txt ^2^>^&^1 start "" /B cmd /c ping localhost -n 11 ^>nul timeout /t 10 /nobreak ) | pause Echo waited timeout /t 12 /nobreak

Усі висловлювання всередині ()виконуються спочатку, дочекайтеся їх завершення, потім виконуються останні два рядки. Усі команди, що startпочинаються з , виконуються одночасно.

Ці посилання корисні: /programming//a/43762349/9689416 та https://ss64.com/nt/start.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.