Pertanyaan Menjalankan beberapa proses latar belakang bersamaan lalu tunggu semuanya berakhir, pada Windows


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


10
2018-03-26 16:10


asal


Melakukannya dapat membahayakan data Anda! - Santosh Kumar
@Santosh: apa yang Anda maksud dengan "dapat membahayakan data Anda"? Dalam kasus spesifik saya, tugas-tugas latar belakang akan memproses kumpulan data independen mereka sendiri. Tidak ada risiko modifikasi bersamaan. - Sergio
Dari sisi API Win32, saya berpikir  WaitForMultipleObjects dengan bWaitAll = TRUE akan melakukan pekerjaan itu. Tidak akan sulit untuk menulis sebuah program yang hanya menghapus program yang diberikan di beberapa file input, jika tidak ada jawaban yang memuaskan. - grawity
@grawity: ya, saya berencana untuk 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 ... - grawity


Jawaban:


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

1.bat dan 2.bat menulis file sementara untuk pemeriksaan main.bat. Sementara 1.bat dan 2.bat bekerja, main.bat melaporkan bahwa pemrosesan masih terjadi. Ketika Anda menekan enter pada 1.bat atau 2.bat's open window, file sementara dihapus, dan program akan 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 ketika Anda selesai. Pada titik ini main.bat dapat melakukan apa pun yang Anda inginkan untuk melakukannya 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!

5
2018-03-26 19:50



Setelah melakukan ini sebelumnya, saya dapat memberitahu Anda bahwa pendekatan ini tidak sesulit kelihatannya. Selain itu, mudah dipelihara - untuk memperluas dan menambahkan logika, dan mudah melatih orang lain untuk mempertahankannya. Biasanya hal-hal ini mengambil kehidupan mereka sendiri ... - RobW
Saya senang dengan solusi ini. - user1068446


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


1
2018-03-26 17:16





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


0
2018-03-26 16:59



Ini tidak menunggu semuanya berhenti? - Tom Wijsman
Tentunya bisa tergantung bagaimana Anda menulisnya. Anda dapat melakukan polling pada pekerjaan yang dimulai untuk melihat apakah mereka telah menyelesaikan dan keluar dari skrip Anda setelah mereka selesai. Kode pada halaman itu memproses seluruh daftar pekerjaan, tiga sekaligus dan menunggu mereka untuk 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 menyakiti perasaan orang lain tetapi Powershell adalah omong kosong. Lebih mudah untuk melakukan ini di C (yang saya pikir mengatakan ...) Terima kasih, saya yakin seseorang masih akan menemukan ini berguna. - Sergio
Jika ada satu hal Powershell tidak omong kosong dan Anda tidak akan menyakiti perasaan saya jika Anda tidak menggunakannya. Anda tidak akan, bagaimanapun, mempelajarinya dalam 30 menit pencarian. - uSlackr
PowerShell bukan omong kosong, itu hanya bahasa pemrograman penuh yang harus dipelajari, bukan sintaks seperti-sh tradisional. Saya ingat merasakan hal yang persis sama tentang Perl, Python, Tcl, C #, dan setiap bahasa lain yang saya coba pelajari "untuk lulz" tanpa penggunaan nyata. (Ketika saya benar-benar dibutuhkan mereka, meskipun, itu berjalan cukup mudah.) - grawity


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 mereka semua telah keluar. (Pengecualian yang mungkin: jika suatu proses secara eksplisit menutup keluaran standar itu mungkin diperlakukan seolah-olah telah keluar. Tetapi itu tidak biasa, sangat sedikit proses yang melakukan itu.)

Saya tidak tahu pasti berapa banyak proses yang dapat Anda luncurkan secara bersamaan dengan cara ini. Saya sudah mencoba hingga sepuluh.


0
2018-03-26 22:37



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


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

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


0
2018-01-17 17:24



Silakan meringkas apa yang dikatakan tautan itu. Jika halamannya turun, jawaban ini tidak akan membantu. - Kevin Panko