Jalankan program sebanyak X kali

18

Bagaimana saya menjalankan program X kali di terminal?

Saya membaca bahwa saya harus melakukan bin / bash txt, tapi saya tidak tahu bagaimana menjalankan X kali ini.

pengguna3597989
sumber
apa itu, naskah, aplikasi, apa fungsinya? apa yang harus terjadi jika terjadi kesalahan? apakah itu menutup setelah berlari? haruskah dicek jika sudah ditutup?
Jacob Vlijm
itu hanya klik, klik xdotool Saya tidak berpikir itu bisa membuat kesalahan.
user3597989
@ KasiyA: Tidak persis seperti semua jawaban itu berulang selamanya. Di sini OP meminta jumlah loop tetap.
Sylvain Pineau
4
Atau Blufter's: askubuntu.com/a/508752/158442 - tetapi keduanya bukan milik di sana, tetapi di sini. : D
muru
2
@KasiyA: Jawaban Ask seharusnya ada di sini bukan di Ulangi perintah setiap x interval waktu di terminal?
Sylvain Pineau

Jawaban:

24

Anda bisa menggunakan xargsdan seq. Umumnya:

seq nr_of_times_to_repeat | xargs -Iz command

Sebagai contoh:

seq 10 | xargs -Iz xdotool click 1

akan menjalankan xdotool click 1perintah sebanyak 10 kali.

Radu Rădeanu
sumber
1
Ini mungkin solusi yang paling elegan, belum lagi yang paling sederhana.
Seth
Saya pikir ini adalah contoh yang sangat bagus untuk menjelaskan karakter pipa.
PascalVKooten
10

Buka Terminal dan gunakan bashperintah berikut :

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

Dengan sedikit verbosity dan 1s delay:

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
Sylvain Pineau
sumber
kesalahan sintax dengan 'do' ..
user3597989
@ user3597989 Ini berfungsi untuk saya, bisakah Anda memeriksanya lagi?
Sylvain Pineau
@ user3597989 oh saya tahu, tolong hapus dulu $. Itu hanya ada untuk menunjukkan prompt shell seperti sylvain@sylvain-ThinkPad-T430s:~$. Kami biasanya menambahkannya ke jawaban baris perintah untuk membedakan perintah dari hasilnya.
Sylvain Pineau
@ user3597989: Saya menghapus prompt shell untuk menghindari kebingungan
Sylvain Pineau
5

Ini harus dilakukan:

#!/bin/bash

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

di mana 10 adalah berapa kali untuk menjalankan perintah

jika Anda perlu membangun sedikit istirahat:

#!/bin/bash

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

Salin skrip ke file kosong, ganti <command to run>dengan xdotoolperintah Anda , simpan sebagai run_xdotool.sh, jalankan dengan perintah:

sh /path/to/run_xdotool.sh

Atau, Anda dapat membuatnya dapat dijalankan dan jalankan saja

/path/to/run_xdotool.sh

Solusi lain: menggunakan opsi pengulangan bawaan xdotool

Karena Anda menyebutkan untuk menggunakannya untuk melakukan klik, cara termudah mungkin adalah dengan menggunakan xdotoolopsi pengulangan bawaan. Formatnya adalah:

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

Untuk melakukan 10 klik mouse (tombol 1) berturut-turut, satu detik di antaranya, perintahnya adalah:

xdotool click --delay 1000 --repeat 10 1
Yakub Vlijm
sumber
5

Jika Anda memiliki GNU Parallel Anda dapat menjalankan:

seq 10 | parallel -N0 doit

Semua komputer baru memiliki banyak inti, tetapi sebagian besar program bersifat serial dan karenanya tidak akan menggunakan banyak inti. Namun, banyak tugas yang sangat dapat diparalelkan:

  • Jalankan program yang sama pada banyak file
  • Jalankan program yang sama untuk setiap baris dalam file
  • Jalankan program yang sama untuk setiap blok dalam file

GNU Parallel adalah pemaralel umum dan membuatnya mudah untuk menjalankan pekerjaan secara paralel pada mesin yang sama atau pada beberapa mesin yang Anda miliki akses ssh.

Jika Anda memiliki 32 pekerjaan berbeda yang ingin Anda jalankan pada 4 CPU, cara langsung untuk memparalelkan adalah menjalankan 8 pekerjaan pada setiap CPU:

Penjadwalan sederhana

GNU Paralel sebagai gantinya memunculkan proses baru ketika proses selesai - menjaga CPU tetap aktif dan dengan demikian menghemat waktu:

Penjadwalan Paralel GNU

Instalasi

Instalasi pribadi tidak memerlukan akses root. Ini dapat dilakukan dalam 10 detik dengan melakukan ini:

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

Untuk opsi instalasi lain, lihat http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Belajarlah lagi

Lihat lebih banyak contoh: http://www.gnu.org/software/parallel/man.html

Tonton video intro: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Ikuti tutorialnya: http://www.gnu.org/software/parallel/parallel_tutorial.html

Mendaftar untuk daftar email untuk mendapatkan dukungan: https://lists.gnu.org/mailman/listinfo/parallel

Ole Tange
sumber
1
Saya suka paralel dan mencoba menyarankan penggunaannya di mana pun saya bisa. Namun satu pertanyaan untuk opsi spesifik Anda: mengapa Anda lebih suka menyarankan formulir ini daripadaparallel -N0 doit ::: {1..10}
Phillip -Zyan K Lee- Stockmann
1
Tidak {1..10}bekerja di (t) csh / fish / ash, dan {1..10}konstruknya dibatasi oleh panjang baris perintah, jadi ini tidak akan berfungsi: {1..1000000000}sedangkan seq 1000000000akan bekerja dengan baik. Tetapi untuk sebagian besar situasi {1..10}akan berfungsi seperti yang diharapkan, dan saya sering menggunakannya juga.
Ole Tange
4

Anda dapat menggunakan forloop gaya C yang memiliki keunggulan dibandingkan versi brace-expansion ( {1..5}) karena dapat menggunakan variabel untuk menentukan titik akhir. Versi mana pun lebih baik daripada menggunakan utilitas eksternal ( seq).

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

Semua dalam satu baris:

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

Atau Anda mungkin dapat melakukannya tanpa loop (untuk utilitas dan fungsi spesifik ini):

xdotool click --repeat 5 --delay 50 1
Dijeda sampai pemberitahuan lebih lanjut.
sumber
0

Cukup Anda dapat menggunakan perintah arloji:

watch -n x <your command>

ubah x ke waktu dalam detik.

Contoh:

watch -n 1 xdotool click 1 

Jadi, xdotool klik 1 akan diulangi setiap 1 detik, hentikan jika sudah selesai.

nux
sumber
4
Saya pikir pertanyaannya adalah khusus menjalankan perintah beberapa kali , tidak begitu banyak pada interval yang ditentukan.
Jacob Vlijm