Menjalankan beberapa proses latar belakang bersamaan lalu menunggu semuanya berakhir, di Windows

14

Adakah yang tahu jika ada skrip cmd yang melakukan itu dan / atau alat baris perintah yang siap untuk pekerjaan itu?

Sergio
sumber
Melakukannya dapat membahayakan data Anda!
Santosh Kumar
8
@Santosh: apa yang Anda maksud dengan "dapat membahayakan data Anda"? Dalam kasus khusus saya, tugas latar belakang akan memproses set data independen mereka sendiri. Tidak ada risiko modifikasi bersamaan.
Sergio
1
Dari sisi API Win32, saya pikir WaitForMultipleObjects dengan bWaitAll = TRUE akan melakukan pekerjaan itu. Tidak akan sulit untuk menulis program yang hanya memotong program yang diberikan dalam beberapa file input, jika tidak ada jawaban yang memuaskan.
user1686
1
@ kegembiraan: ya, saya berencana melakukan hal itu jika tidak ada yang muncul (dan memposting kode di sini), tetapi mari kita lihat apakah saya dapat menghindari menciptakan kembali roda :)
Sergio
Menemukan kembali roda adalah hal yang baik jika roda yang ada saat ini berbentuk bujur sangkar ...
user1686

Jawaban:

10

Buat tiga file batch di bawah ini. Main.bat meluncurkan 1.bat dan 2.bat

1.bat dan 2.bat menulis file sementara yang diperiksa main.bat. Ketika 1.bat dan 2.bat berfungsi, main.bat melaporkan kembali bahwa pemrosesan masih terjadi. Ketika Anda menekan enter pada jendela terbuka 1.bat atau 2.bat, file sementara dihapus, dan program keluar. Ini mensimulasikan pemrosesan berhenti untuk file .bat itu. Jika Anda melakukan ini untuk 1 dan 2.bat, main.bat melaporkan kepada Anda bahwa pemrosesan telah selesai untuk proses ini. Anda dapat membuat 1.bat dan 2.bat melakukan apa pun yang Anda inginkan, selama Anda menghapus file sementara saat Anda selesai. Pada titik ini main.bat dapat melakukan apapun yang Anda inginkan juga.

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!
RobW
sumber
Setelah melakukan ini sebelumnya, saya dapat memberitahu Anda bahwa pendekatan ini tidak sesulit kelihatannya. Selain itu, mudah untuk mempertahankan - untuk memperluas dan menambahkan logika, dan mudah untuk melatih orang lain untuk mempertahankannya. Biasanya hal-hal ini mengambil nyawa mereka sendiri ...
RobW
Saya senang dengan solusi ini.
user1068446
6

Cukup sederhana, asalkan prosesnya tidak memerlukan input atau output standar. Dari baris perintah, atau dalam file batch:

process1 | process2 | process3 | process4

Ini akan menjalankan keempat proses secara bersamaan, dan tidak akan kembali sampai semuanya keluar. (Kemungkinan pengecualian: jika suatu proses secara eksplisit menutup output standar mungkin diperlakukan seolah-olah telah keluar. Tapi itu tidak biasa, sangat sedikit proses melakukan itu.)

Saya tidak yakin persis berapa banyak proses yang dapat Anda luncurkan secara simultan dengan cara ini. Saya sudah mencoba hingga sepuluh.

Harry Johnston
sumber
Uhm, yang saya dapatkan adalah bahwa semua proses memang dimulai sekaligus, tetapi process3 tetap menunggu sampai proses4 selesai, proses2 terus menunggu sampai proses3 selesai, dan seterusnya. Ngomong-ngomong, ini dari command prompt Windows klasik.
Sergio
@Sergio: Apa yang Anda maksud dengan "terus menunggu"?
Harry Johnston
1

Satu-satunya cara untuk melakukan ini adalah memulai file batch yang terpisah (lihat start /?) yang menjalankan tugas individu dan menulis file teks setelah selesai. Kemudian, Anda secara berkala memeriksa apakah file teks telah dibuat.

Tamara Wijsman
sumber
0

Anda mungkin melihat cmdlet Start-Job Powershell. Seharusnya memungkinkan Anda untuk melakukan ini. Lebih lanjut di sini Powershell adalah pilihan Microsoft. Ini jauh lebih kuat daripada skrip cmd dan juga investasi waktu Anda

uSlackr
sumber
Ini tidak menunggu semuanya berakhir?
Tamara Wijsman
Itu tentu bisa tergantung bagaimana Anda menulisnya. Anda dapat polling pekerjaan yang dimulai untuk melihat apakah mereka telah selesai dan keluar dari skrip Anda setelah mereka miliki. Kode pada halaman itu memproses seluruh daftar pekerjaan, tiga sekaligus dan menunggu mereka keluar.
uSlackr
Uhm, tidak pernah melakukan apa pun sebelumnya dengan Powershell. Saya mencoba mengubah contoh untuk menjalankan proses sewenang-wenang dan menunggu mereka untuk menyelesaikan dan setelah sekitar 30 menit dan 100 pencarian pada M $ technet saya menyerah. Saya minta maaf jika saya melukai perasaan siapa pun tetapi Powershell adalah omong kosong. Lebih mudah untuk melakukan ini dalam C (yang saya pikir mengatakan ...) Bagaimanapun juga, saya yakin seseorang masih akan menemukan ini berguna.
Sergio
Jika ada satu hal yang Powershell tidak omong kosong dan Anda tidak akan menyakiti perasaan saya jika Anda tidak menggunakannya. Namun, Anda tidak akan mempelajarinya dalam 30 menit pencarian.
uSlackr
1
PowerShell bukan omong kosong, itu hanya bahasa pemrograman lengkap yang harus dipelajari, alih-alih sintaks seperti sh. Saya ingat merasakan hal yang persis sama tentang Perl, Python, Tcl, C #, dan setiap bahasa lain yang saya coba pelajari "untuk lulz" tanpa penggunaan yang nyata. (Ketika saya benar - benar membutuhkannya , itu berjalan cukup mudah.)
user1686
0

Atau Anda dapat menggunakan ini: http://www.out-web.net/?p=167

Saya berhasil, berhasil, namun kadang-kadang terjadi bahwa PID dari proses selesai segera digunakan kembali oleh prosesus Windows lain yang baru saja dimulai, dan itu membuat deteksi akhir proses Anda berbahaya / salah.

OlivierR
sumber
2
Silakan rangkum apa yang dikatakan tautan itu. Jika halaman turun, jawaban ini tidak akan membantu.
Kevin Panko
Terlambat sepertinya.
Robert Massa
0

Saya juga mencari tugas serupa. Tujuannya adalah untuk menjalankan beberapa perintah secara paralel dan mengekstrak output (stdout & error) dari semua proses paralel. Kemudian tunggu semua proses paralel untuk menyelesaikan dan menjalankan perintah lain. Berikut ini adalah contoh kode untuk file BAT, dapat dieksekusi dalam 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

Semua pernyataan di dalam ()dieksekusi terlebih dahulu, tunggu sampai selesai, lalu dua baris terakhir dieksekusi. Semua perintah yang dimulai startdijalankan secara bersamaan.

Tautan ini sangat membantu: /programming//a/43762349/9689416 dan https://ss64.com/nt/start.html

Vivek
sumber