Esecuzione di più processi in background simultanei, quindi attendere il termine di tutti, su Windows


14

Qualcuno sa se esiste uno script cmd che lo fa e / o uno strumento da riga di comando pronto per il lavoro?


Ciò potrebbe danneggiare i tuoi dati!
Santosh Kumar,

8
@Santosh: cosa intendi con "può danneggiare i tuoi dati"? Nel mio caso specifico, le attività in background elaborano i propri set di dati indipendenti. Nessun rischio di modifiche simultanee.
Sergio,

1
Dal lato API di Win32, penso che WaitForMultipleObjects con bWaitAll = TRUE farebbe il lavoro. Non sarebbe difficile scrivere un programma che elimina solo i programmi forniti in alcuni file di input, se non ci sono risposte soddisfacenti.
user1686

1
@grawity: sì, ho intenzione di farlo proprio se non dovesse succedere nulla (e postare il codice qui), ma vediamo se riesco a evitare di reinventare la ruota :)
Sergio

Reinventare la ruota è una buona cosa se le ruote attualmente esistenti sono quadrate ...
user1686

Risposte:


10

Creare i tre file batch di seguito. Main.bat lancia 1.bat e 2.bat

1.bat e 2.bat scrivono file temporanei per i quali main.bat controlla. Mentre 1.bat e 2.bat funzionano, main.bat riporta che l'elaborazione è ancora in corso. Quando premi Invio sulla finestra aperta di 1.bat o 2.bat, il file temporaneo viene eliminato e il programma termina. Questo simula l'interruzione dell'elaborazione per quel file .bat. Se lo fai per 1 e 2.bat, main.bat ti informa che l'elaborazione è stata completata per questi processi. Puoi fare in modo che 1.bat e 2.bat facciano tutto quello che vuoi, purché tu abbia finito il file temporaneo. A questo punto main.bat può fare anche tutto quello che vuoi.

1.bat

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

2.bat

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!

Dopo averlo fatto prima, posso dirti che questo approccio non è così difficile come sembra. Inoltre, è facile da mantenere: espandere e aggiungere logica e addestrare qualcun altro a mantenerla. Di solito queste cose prendono vita da sole ...
RobW,

Sono contento di questa soluzione.
user1068446

6

Abbastanza semplice, a condizione che i processi non richiedano input o output standard. Dalla riga di comando o in un file batch:

process1 | process2 | process3 | process4

Questo eseguirà tutti e quattro i processi contemporaneamente e non tornerà finché non saranno usciti tutti. (Possibile eccezione: se un processo chiude esplicitamente l'output standard, potrebbe essere trattato come se fosse uscito. Ma è insolito, pochissimi processi lo fanno.)

Non sono sicuro di quanti processi sia possibile avviare contemporaneamente in questo modo. Ho provato fino a dieci.


Uhm, quello che ottengo è che tutti i processi sono effettivamente avviati contemporaneamente, ma process3 è in attesa fino al completamento di process4, process2 è in attesa fino al completamento di process3 e così via. Questo è dal classico prompt dei comandi di Windows a proposito.
Sergio,

@Sergio: cosa intendi con "continuato ad aspettare"?
Harry Johnston,

1

L'unico modo per farlo è avviare file batch separati (vedere start /?) che eseguono la singola attività e scrivere un file di testo al completamento. Quindi, si controlla periodicamente se i file di testo sono stati creati.


0

È possibile esaminare il cmdlet Start-Job di Powershell. Dovrebbe permetterti di farlo. Altro qui Powershell è la shell scelta da Microsoft. È molto più potente degli script cmd e ben investe l'investimento del tuo tempo


Questo non aspetta che terminino tutti?
Tamara Wijsman,

Certamente può dipendere da come lo scrivi. Puoi eseguire il polling dei lavori avviati per vedere se sono stati completati e uscire dallo script una volta che lo hanno fatto. Il codice su quella pagina elabora un intero elenco di lavori, tre alla volta e attende la loro uscita.
uSlackr,

Uhm, non ho mai fatto niente prima con Powershell. Ho provato a cambiare l'esempio per eseguire processi arbitrari e aspettare che si completino e dopo circa 30 minuti e 100 ricerche su M $ technet ho rinunciato. Mi dispiace se ho ferito i sentimenti di qualcuno, ma Powershell è una schifezza. È più facile farlo in C (che credo stia dicendo ...) Grazie comunque, scommetto che qualcuno lo troverà comunque utile.
Sergio,

Se c'è una cosa che Powershell non è è una schifezza e non ferirai i miei sentimenti se non la usi. Tuttavia, non lo imparerai in 30 minuti di ricerca.
uSlackr,

1
PowerShell non è una schifezza, è solo un linguaggio di programmazione completo che uno deve imparare, invece di una sintassi sh-like tradizionale. Ricordo di essermi sentito esattamente allo stesso modo su Perl, Python, Tcl, C # e su ogni altra lingua che ho cercato di imparare "per il lulz" senza ancora usarlo. (Quando in realtà ne avevo bisogno , però, è andato abbastanza facilmente.)
user1686

0

Oppure puoi usare questo: http://www.out-web.net/?p=167

L'ho fatto, funziona, tuttavia a volte capita che il PID del processo finito venga immediatamente riutilizzato da un altro processus di Windows appena avviato, e rende pericoloso / errato il rilevamento della fine del processo.


2
Riassumi ciò che dice quel link. Se la pagina scende, questa risposta non sarà utile.
Kevin Panko,

Sembra troppo tardi.
Robert Massa,

0

Stavo anche cercando un compito simile. L'obiettivo era eseguire più comandi in parallelo ed estrarre l'output (stdout ed errore) di tutti i processi paralleli. Quindi attendere il completamento di tutti i processi paralleli ed eseguire un altro comando. Di seguito è riportato un codice di esempio per il file BAT, che può essere eseguito in 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

Tutte le istruzioni all'interno ()vengono eseguite per prime, attendi che vengano completate, quindi vengono eseguite le ultime due righe. Tutti i comandi che iniziano con startvengono eseguiti contemporaneamente.

Questi link sono utili: /programming//a/43762349/9689416 e https://ss64.com/nt/start.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.