Birden fazla eşzamanlı arka plan işlemi çalıştırdıktan sonra Windows'ta hepsinin sona ermesini bekleyin


11

Bunu yapan bir cmd betiği ve / veya iş için hazır bir komut satırı aracı olup olmadığını bilen var mı?


Bunu yapmak verilerinize zarar verebilir!
Santosh Kumar

8
@Santosh: "verilerinize zarar verebilir" ile neyi kastediyorsunuz? Özel durumumda, arka plan görevleri kendi bağımsız veri kümelerini işlerdi. Eşzamanlı değişiklik riski yoktur.
Sergio

1
Win32 API tarafında, ben düşünmek WaitForMultipleObjects bWaitAll = TRUE ile işi yapardı. Tatmin edici cevaplar yoksa, bazı girdi dosyalarında verilen programları devre dışı bırakan bir program yazmak zor olmaz.
grawity

1
@grawity: evet, sadece bir şey çıkmazsa bunu yapmayı planlıyorum (ve kodu buraya yazın), ama bakalım tekerleği yeniden icat etmekten kaçınabilir miyim :)
Sergio

Mevcut tekerleklerin kare olması durumunda, tekerleğin yeniden icat edilmesi iyi bir şeydir ...
grawity

Yanıtlar:


6

Aşağıdaki üç toplu iş dosyasını oluşturun. Main.bat, 1.bat ve 2.bat'ı başlattı

1.bat ve 2.bat, main.bat dosyasının kontrol ettiği geçici dosyaları yazar. 1.bat ve 2.bat çalışırken, main.bat işlemlerin hala devam ettiğini rapor eder. 1.bat veya 2.bat'ın açık penceresine girdiğinizde, geçici dosya silinir ve program kapanır. Bu, bu .bat dosyası için durmayı işlemeyi simüle eder. Bunu hem 1 hem de 2.bat için yaparsanız, main.bat size işlemlerin bu işlemler için tamamlandığını bildirir. Tamamladığınızda geçici dosyayı temizlediğiniz sürece 1.bat ve 2.bat istediğiniz bir şey yapabilirsiniz. Bu noktada main.bat, yapmasını istediğiniz her şeyi yapabilir.

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!

Bunu daha önce yaptım, size bu yaklaşımın göründüğü kadar zor olmadığını söyleyebilirim. Ek olarak, bakımı kolay - genişletmek ve mantık eklemek ve bakımı için başka birini eğitmek kolaydır. Genellikle bu şeyler kendi hayatlarını alır ...
RobW

Bu çözümden memnunum.
user1068446

1

Bunu yapmanın tek yolu ayrı bir toplu iş dosyası başlatmaktır (bkz. start /? bireysel görevi çalıştırmak ve tamamlandıktan sonra bir metin dosyası yazmak. Ardından, düzenli olarak metin dosyalarının yapılıp yapılmadığını kontrol edersiniz.


1

İşlemler standart girdi ya da çıktıya ihtiyaç duymazsa, yeterince basit. Komut satırından veya bir toplu iş dosyasında:

process1 | process2 | process3 | process4

Bu, dört işlemin tümünü aynı anda yürütecek ve hepsi çıkana kadar geri dönmeyecek. (Muhtemel istisna: Eğer bir işlem standart çıktıyı açıkça kapatırsa, işlem bitmiş gibi ele alınabilir. Fakat bu alışılmadık bir işlemdir.

Bu şekilde aynı anda kaç işlemi başlatabildiğinizden emin değilim. 10'a kadar denedim.


Uhm, anladığım kadarıyla tüm işlemler gerçekten bir kerede başlamış, ancak işlem3 işlem tamamlanıncaya kadar bekletiliyor, işlem2 işlem3 tamamlanana kadar bekletiliyor. Bu arada, klasik Windows komut isteminden geliyor.
Sergio

@Sergio: "Bekletmeye devam etmek" derken ne demek istiyorsun?
Harry Johnston

0

Powershell Start-Job cmdlet'ine bakabilirsiniz. Bunu yapmana izin vermeli. Daha İşte Powershell, Microsoft'un tercih ettiği bir kabuktur. Cmd komut dosyalarından çok daha güçlü ve zamanınızın yatırımına değer


Bu, hepsinin sona ermesini beklemiyor mu?
Tom Wijsman

Nasıl yazdığınıza bağlı olarak kesinlikle olabilir. Tamamlanmış olup olmadıklarını görmek ve başlattıktan sonra komut dosyanızdan çıkmak için başlatılan işleri yoklayabilirsiniz. Bu sayfadaki kod, bir kerede üçü işlerin tamamını işler ve çıkmalarını bekler.
uSlackr

Uhm, daha önce Powershell ile hiçbir şey yapmadım. Örneği keyfi işlemleri yürütmek için değiştirmeye çalıştım ve bitmelerini bekledim ve M $ tekniğinden yaklaşık 30 dakika ve 100 aramadan sonra bıraktım. Herhangi birinin duygularını incittiğim için üzgünüm ama Powershell çok saçma. Bunu C 'de yapmak daha kolay (sanırım anlatıyor ...) Yine de teşekkürler, birileri hala bunu faydalı bulacaktır.
Sergio

Bir şey varsa, Powershell saçmalık değildir ve kullanmazsanız duygularımı incitmezsiniz. Bununla birlikte, 30 dakika içinde arama yaparak öğrenemezsiniz.
uSlackr

1
PowerShell saçma değil, geleneksel sh benzeri bir sözdizimi yerine öğrenmesi gereken tam bir programlama dili. Hiçbir gerçek kullanım olmadan Perl, Python, Tcl, C # ve "lulz için" öğrenmeye çalıştığım diğer dillerle aynı şekilde hissettiğimi hatırlıyorum. (Aslında ben gerekli Onları olsa, oldukça kolay gitti.
grawity

0

Veya bunu kullanabilirsiniz: http://www.out-web.net/?p=167

Yaptım, işe yarıyor, ancak bazen bitmiş işlemin PID'sinin hemen yeni başlayan başka bir Windows işlemcisi tarafından yeniden kullanılması ve işleminizin sona ermesinin tespit edilmesini tehlikeli / hatalı hale getirmesi oluyor.


1
Lütfen bu bağlantının ne dediğini özetleyin. Sayfa kapanırsa, bu cevap yardımcı olmayacaktır.
Kevin Panko

0

Ben de benzer bir iş arıyordum. Amaç paralel olarak çoklu komut çalıştırmak ve tüm paralel işlemlerin çıktısını (stdout & error;) çıkartmaktı. Ardından tüm paralel işlemlerin bitmesini ve başka bir komutu yürütmesini bekleyin. Aşağıda BAT dosyası için örnek kod verilmiştir, CMD'de yürütülebilir:

( 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

İçindeki tüm ifadeler () önce yürütülür, tamamlanmalarını bekleyin, sonra son iki satır yürütülür. İle başlayan tüm komutlar start aynı anda yürütülür.

Bu bağlantılar faydalıdır: https://stackoverflow.com/a/43762349/9689416 ve https://ss64.com/nt/start.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.