Bir programı X kez çalıştırın


18

Terminalde bir programı X kez nasıl yürütebilirim?

Ben bir bin / bash txt yapmak zorunda okudum, ama bu X kez yürütmek için nasıl bilmiyorum.


nedir, bir senaryo, bir uygulama, ne işe yarar? hata durumunda ne olmalı? koştuktan sonra kapanıyor mu? kapanıp kapanmadığını kontrol etmeli mi?
— Jacob Vlijm

onun sadece bir tıklama, xdotool tıklayın bir hata oluşturabileceğini sanmıyorum.
— user3597989

@KasiyA: Tüm bu cevaplar sonsuza dek dönüyor gibi değil. Burada OP sabit sayıda döngü ister.
— Sylvain Pineau

4
Veya Blufter'ın: askubuntu.com/a/508752/158442 - ama ikisi de oraya ait değil, ama burada. : D
— muru

2
@KasiyA: Ask'ın cevabı burada olmamalı Terminalde her x aralıkta bir komutu tekrarla?
— Sylvain Pineau

Yanıtlar:


24

Sen kullanabilirsiniz xargsve seq. genelde:

seq nr_of_times_to_repeat | xargs -Iz command

Örneğin:

seq 10 | xargs -Iz xdotool click 1

xdotool click 1komutu 10 kez yürütür .


1
Bu muhtemelen en basitinden bahsetmiyorum bile, en zarif çözümdür.
— Seth

Bence bu, boru karakterini açıklamak için gerçekten iyi bir örnek.
— PascalVKooten

10

Bir Terminal açın ve aşağıdaki bashkomutu kullanın:

for i in {1..5}; do xdotool click 1; done

Biraz ayrıntı ve 1 saniye gecikme ile:

for i in {1..5}; do echo click \#$i && xdotool click 1 && sleep 1; done
click #1
click #2
click #3
click #4
click #5

'do' ile
— sintax

@ user3597989 Benim için çalışıyor, tekrar kontrol edebilir misin?
— Sylvain Pineau

@ user3597989 oh biliyorum, lütfen ilkini kaldırın $. Sadece bir kabuk istemi belirtmek için orada sylvain@sylvain-ThinkPad-T430s:~$. Genellikle komutu sonuçlarından ayırmak için komut satırı yanıtlarına ekleriz.
— Sylvain Pineau

@ user3597989: Karışıklığı önlemek için kabuk istemini kaldırdım
— Sylvain Pineau

5

Bu şunları yapmalıdır:

#!/bin/bash

x=1
while [ $x -le 10 ]
do
  <command to run>
  x=$(( $x + 1 ))
done

burada 10 komutu çalıştırma sayısıdır

küçük bir mola vermeniz gerekiyorsa:

#!/bin/bash

x=1
while [ $x -le 10 ]
do
  <command to run>
  sleep 1
  x=$(( $x + 1 ))
done

Yerine, boş bir dosya içine komut dosyasını kopyalayın <command to run>senin tarafından xdotoololarak kaydedin, komuta run_xdotool.sh, komutla çalıştırın:

sh /path/to/run_xdotool.sh

Alternatif olarak, çalıştırılabilir hale getirebilir ve

/path/to/run_xdotool.sh

Başka bir çözüm: xdotool'un yerleşik tekrarlama seçeneğini kullanma

Tıklama yapmak için kullandığınızdan bahsettiğinizden, en kolayı xdotoolkendi yerleşik tekrarlama seçeneğini kullanmak olabilir . Biçim:

xdotool click --delay <delay> --repeat <repeats> <button>
(delay in milliseconds between the clicks)

Arada bir saniye arayla 10 fare tıklaması (düğme 1) yapmak için komut şu şekildedir:

xdotool click --delay 1000 --repeat 10 1

5

GNU Paraleliniz varsa şunları çalıştırabilirsiniz:

seq 10 | parallel -N0 doit

Tüm yeni bilgisayarların birden fazla çekirdeği vardır, ancak çoğu program seri niteliktedir ve bu nedenle birden çok çekirdeği kullanmayacaktır. Bununla birlikte, birçok görev son derece paralelleştirilebilir:

  • Aynı programı birçok dosyada çalıştırın
  • Bir dosyadaki her satır için aynı programı çalıştırın
  • Bir dosyadaki her blok için aynı programı çalıştırın

GNU Parallel genel bir paralelleştiricidir ve işleri aynı makinede veya ssh erişimine sahip olduğunuz birden fazla makinede paralel olarak çalıştırmayı kolaylaştırır.

4 CPU'da çalıştırmak istediğiniz 32 farklı işiniz varsa, paralelleştirmenin basit bir yolu her CPU'da 8 iş çalıştırmaktır:

Basit zamanlama

Bunun yerine GNU Parallel, işlemci bittiğinde yeni bir süreç oluşturur - CPU'ları aktif tutar ve böylece zamandan tasarruf sağlar:

GNU Paralel zamanlama

Kurulum

Kişisel kurulum root erişimi gerektirmez. Bunu yaparak 10 saniye içinde yapılabilir:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Diğer kurulum seçenekleri için bkz. Http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Daha fazla bilgi edin

Daha fazla örneğe bakın: http://www.gnu.org/software/parallel/man.html

Giriş videolarını izleyin: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Eğiticiyi gözden geçirin: http://www.gnu.org/software/parallel/parallel_tutorial.html

Destek almak için e-posta listesine kaydolun: https://lists.gnu.org/mailman/listinfo/parallel


1
Paralel seviyorum ve mümkün olan her yerde kullanımını önermeye çalışıyorum. Özel seçeneğinize rağmen bir soru: neden bu formu önermeyi tercih ettinizparallel -N0 doit ::: {1..10}
— Phillip -Zyan K Lee- Stockmann

1
{1..10}(T), CSH / balık / kül çalışmaz, ve {1..10}bu iş olmayacak şekilde yapı, komut hattı uzunluğu ile sınırlıdır: {1..1000000000}oysa seq 1000000000sadece iyi çalışır. Ancak çoğu durum {1..10}beklendiği gibi çalışacaktır ve ben de bunu sık sık kullanıyorum.
— Ole Tange

4

Bitiş noktalarını belirtmek için değişkenleri kullanabilmenin foravantajına sahip olan bir C stili döngü {1..5}kullanabilirsiniz. Her iki sürüm de harici bir yardımcı program ( seq) kullanmaktan daha iyidir .

t=5
for ((x = 1; x <= t; x++))
do
    xdotool click 1
done

Hepsi bir satırda:

t=5; for ((x = 1; x <= t; x++)); do xdotool click 1; done

Veya bunu bir döngü olmadan yapabilirsiniz (bu belirli yardımcı program ve işlev için):

xdotool click --repeat 5 --delay 50 1

0

Sadece watch komutunu kullanabilirsiniz:

watch -n x <your command>

x değerini saniye cinsinden zamana değiştirin.

Misal :

watch -n 1 xdotool click 1 

Yani xdotool tıklama 1 her 1 saniyede bir tekrarlanacaktır, işiniz bittiğinde sonlandırın.


4
Sorunun, belirli bir aralıkta değil , komutun belirli sayıda çalıştırılmasına özgü olduğunu düşünüyorum .
— Jacob Vlijm
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.