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.