여러 개의 동시 백그라운드 프로세스를 실행 한 후 Windows에서 모든 프로세스가 종료 될 때까지 기다립니다.


14

그 작업을 수행하는 cmd 스크립트 및 / 또는 명령 줄 도구가 있는지 알고 있습니까?


데이터가 손상 될 수 있습니다!
Santosh Kumar

8
@Santosh : "데이터를 손상시킬 수있다"는 것은 무엇을 의미합니까? 필자의 경우 백그라운드 작업은 자체 독립 데이터 세트를 처리합니다. 동시 수정의 위험이 없습니다.
세르지오

1
Win32 API 측면에서 bWaitAll = TRUE 인 WaitForMultipleObjects 가 작업을 수행 한다고 생각 합니다. 만족스러운 답변이 없다면 일부 입력 파일에 주어진 프로그램을 분기시키는 프로그램을 작성하는 것은 어렵지 않습니다.
user1686

1
@grawity : 그렇습니다. 만약 아무것도 나오지 않는다면 (그리고 여기에 코드를 게시하십시오), 바퀴를 재발 명하지 않을 수 있는지 살펴 봅시다 :)
Sergio

현재 존재하는 바퀴가 정사각형이면 바퀴를 재창조하는 것이 좋습니다.
user1686

답변:


10

아래에 세 개의 배치 파일을 작성하십시오. Main.bat는 1.bat 및 2.bat를 시작합니다.

1.bat 및 2.bat는 main.bat가 확인하는 임시 파일을 작성합니다. 1.bat 및 2.bat가 작동하는 동안 main.bat는 처리가 여전히 진행 중임을보고합니다. 1.bat 또는 2.bat의 열린 창에서 Enter 키를 누르면 임시 파일이 삭제되고 프로그램이 종료됩니다. 해당 .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

이 솔루션에 만족합니다.
user1068446

@ping 명령을 확장 할 수 있습니까? 왜 당신이 이것을 선택하고 127.0.0.1이 무엇인지 이해하지 못합니다.

6

프로세스에 표준 입력 또는 출력이 필요하지 않으면 간단합니다. 명령 행 또는 배치 파일에서 :

process1 | process2 | process3 | process4

이렇게하면 4 개의 프로세스가 모두 동시에 실행되며 모두 종료 될 때까지 반환되지 않습니다. (가능한 예외 : 프로세스가 표준 출력을 명시 적으로 닫으면 마치 마치 마치 마치 마치 출력 된 것으로 간주 될 수 있습니다. 그러나 비정상적인 프로세스는 거의 없습니다.)

이 방법으로 동시에 얼마나 많은 프로세스를 시작할 수 있는지 잘 모르겠습니다. 나는 10까지 시도했다.


음, 내가 얻는 것은 모든 프로세스가 실제로 한 번에 시작되지만 process3이 process4가 완료 될 때까지 대기하고 process2는 process3이 완료 될 때까지 대기하는 것입니다. 그건 그렇고 고전 Windows 명령 프롬프트에서 온 것입니다.
세르지오

@Sergio : "케팅 대기"란 무엇을 의미합니까?
Harry Johnston

1

이를 수행하는 유일한 방법 start /?은 개별 작업을 실행하는 별도의 배치 파일 (참조 ) 을 시작 하고 완료시 텍스트 파일을 작성하는 것입니다. 그런 다음 텍스트 파일이 만들어 졌는지 정기적으로 확인하십시오.


0

Powershell Start-Job cmdlet을 볼 수 있습니다. 그렇게 할 수 있어야합니다. 더 여기 PowerShell은 선택의 마이크로 소프트의 껍질이다. 그것은 cmd 스크립트보다 훨씬 강력하며 시간을 투자 할 가치가 있습니다.


이것들이 모두 종료되기를 기다리지 않습니까?
Tamara Wijsman

어떻게 쓰는지에 따라 확실히 할 수 있습니다. 시작된 작업을 폴링하여 작업이 완료되었는지 확인하고 스크립트가 완료되면 종료 할 수 있습니다. 해당 페이지의 코드는 한 번에 3 개의 전체 작업 목록을 처리하고 종료 될 때까지 기다립니다.
uSlackr

음, Powershell을 사용해 본 적이 없습니다. 나는 임의의 프로세스를 실행하고 프로세스가 완료 될 때까지 기다렸다가 M $ technet에서 약 30 분과 100 번의 조회 후에 포기했다. 다른 사람의 감정을 상하게해서 미안하지만 Powershell은 엉망입니다. C 에서이 작업을 수행하는 것이 더 쉽습니다.
Sergio

Powershell에없는 것이 쓰레기라면 사용하지 않으면 내 감정을 상하게하지 않을 것입니다. 그러나 30 분 동안 검색하지는 않습니다.
uSlackr

1
PowerShell은 엉망이 아니며 전통적인 sh와 같은 구문 대신 배우는 완전한 프로그래밍 언어 일뿐입니다. 나는 Perl, Python, Tcl, C # 및 내가 실제로 사용하지 않고 "lulz를 위해"배우려고 노력한 다른 모든 언어에 대해 똑같은 느낌을 느낀 것을 기억합니다. (실제로 내가 필요할 때 상당히 쉽게 진행되었습니다.)
user1686

0

또는 이것을 사용할 수 있습니다 : http://www.out-web.net/?p=167

내가 해냈지만 작동하지만 때로는 완료 된 프로세스의 PID가 방금 시작한 다른 Windows 프로세스에서 즉시 재사용되어 프로세스 끝의 위험을 감지하는 경우가 있습니다.


2
해당 링크의 내용을 요약하십시오. 페이지가 다운되면이 답변이 도움이되지 않습니다.
케빈 판코

너무 늦었다.
Robert Massa 9

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/9689416https://ss64.com/nt/start.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.