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.