เรียกใช้โปรแกรม X ครั้ง


18

ฉันจะรันโปรแกรม X ครั้งในเทอร์มินัลได้อย่างไร

ฉันอ่านว่าฉันต้องทำ bin / bash txt แต่ฉันไม่รู้วิธีการใช้งาน X ครั้งนี้


มันคืออะไรสคริปต์แอปพลิเคชันมันทำอะไร? จะเกิดอะไรขึ้นในกรณีที่เกิดข้อผิดพลาด มันปิดไหมหลังจากวิ่ง? ควรตรวจสอบมันถ้ามันปิด?
Jacob Vlijm

เพียงคลิกเดียวคลิก xdotool ฉันไม่คิดว่าจะสามารถสร้างข้อผิดพลาดได้
3597989

@KasiyA: ไม่เหมือนกับคำตอบทั้งหมดที่วนซ้ำไปตลอดกาล ที่นี่ OP ขอหมายเลขวนซ้ำ
Sylvain Pineau

4
หรือของ Blufter: askubuntu.com/a/508752/158442 - แต่ทั้งคู่ไม่ได้อยู่ที่นั่น แต่ที่นี่ : D
muru

2
@KasiyA: คำตอบของคำถามไม่ควรอยู่ที่นี่ซ้ำคำสั่งทุกช่วงเวลา x ใน terminal?
Sylvain Pineau

คำตอบ:


24

คุณสามารถใช้และxargs seqโดยทั่วไป:

seq nr_of_times_to_repeat | xargs -Iz command

ตัวอย่างเช่น:

seq 10 | xargs -Iz xdotool click 1

จะรันxdotool click 1คำสั่ง 10 ครั้ง


1
นี่อาจเป็นทางออกที่หรูหราที่สุดไม่ต้องพูดถึงที่ง่ายที่สุด
เซท

ฉันคิดว่านี่เป็นตัวอย่างที่ดีมากสำหรับการอธิบายลักษณะของท่อ
PascalVKooten

10

เปิด Terminal และใช้bashคำสั่งต่อไปนี้:

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

ด้วยความฟุ่มเฟื่อยและล่าช้า 1s:

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

ข้อผิดพลาด sintax กับ 'ทำ' ..
3597989

@ user3597989 มันใช้งานได้สำหรับฉันคุณช่วยตรวจสอบอีกครั้งได้ไหม
Sylvain Pineau

@ user3597989 $โอ้ฉันรู้โปรดลบครั้งแรก sylvain@sylvain-ThinkPad-T430s:~$มันเป็นเพียงมีเพื่อระบุเปลือกเช่นพรอมต์ เรามักจะเพิ่มลงในคำตอบของบรรทัดคำสั่งเพื่อแยกความแตกต่างคำสั่งจากผลลัพธ์ของมัน
Sylvain Pineau

@ user3597989: ฉันลบ shell prompt เพื่อหลีกเลี่ยงความสับสน
Sylvain Pineau

5

สิ่งนี้ควรทำ:

#!/bin/bash

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

โดยที่ 10 คือจำนวนครั้งในการรันคำสั่ง

ถ้าคุณต้องการสร้างในช่วงพัก

#!/bin/bash

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

คัดลอกสคริปต์ลงในไฟล์เปล่าแทนที่<command to run>ด้วยxdotoolคำสั่งของคุณบันทึกเป็นrun_xdotool.shรันโดยคำสั่ง:

sh /path/to/run_xdotool.sh

หรือคุณสามารถทำให้มันใช้งานได้และเพียงแค่เรียกใช้โดย

/path/to/run_xdotool.sh

โซลูชันอื่น: การใช้ xdotool ในตัวเลือกการทำซ้ำ

เนื่องจากคุณพูดถึงการใช้เพื่อทำการคลิกวิธีที่ง่ายที่สุดคือการใช้xdotoolตัวเลือกการทำซ้ำในตัวเอง รูปแบบคือ:

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

หากต้องการคลิกเมาส์ 10 ครั้ง (ปุ่ม 1) ต่อเนื่องหนึ่งวินาทีในระหว่างนั้นคำสั่งคือ:

xdotool click --delay 1000 --repeat 10 1

5

หากคุณมี GNU Parallel คุณสามารถเรียกใช้:

seq 10 | parallel -N0 doit

คอมพิวเตอร์เครื่องใหม่ทุกเครื่องมีหลายคอร์ แต่โปรแกรมส่วนใหญ่เป็นแบบอนุกรมและจะไม่ใช้หลายคอร์ อย่างไรก็ตามงานหลายอย่างขนานกันมาก:

  • เรียกใช้โปรแกรมเดียวกันกับไฟล์จำนวนมาก
  • รันโปรแกรมเดียวกันสำหรับทุกบรรทัดในไฟล์
  • เรียกใช้โปรแกรมเดียวกันสำหรับทุก ๆ บล็อกในไฟล์

GNU Parallel เป็นตัวปรับเทียบทั่วไปและทำให้การเรียกใช้งานแบบขนานบนเครื่องเดียวกันหรือบนเครื่องหลายเครื่องที่คุณเข้าถึงได้ง่าย

หากคุณมี 32 งานที่แตกต่างกันที่คุณต้องการเรียกใช้บน 4 CPU ทางตรงไปข้างหน้าเพื่อขนานคือการรัน 8 งานในแต่ละ CPU:

การตั้งเวลาอย่างง่าย

GNU Parallel แทนการวางกระบวนการใหม่เมื่อเสร็จสิ้น - ทำให้ซีพียูทำงานและประหยัดเวลา:

GNU Parallel Scheduling

การติดตั้ง

การติดตั้งส่วนบุคคลไม่ต้องการการเข้าถึงรูท สามารถทำได้ภายใน 10 วินาทีโดยทำสิ่งนี้:

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

สำหรับตัวเลือกการติดตั้งอื่น ๆ ดูที่http://git.savannah.gnu.org/cgit/parallel.git/tree/README

เรียนรู้เพิ่มเติม

ดูตัวอย่างเพิ่มเติม: http://www.gnu.org/software/parallel/man.html

ดูวิดีโอแนะนำ: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

ดำเนินการตามบทช่วยสอน: http://www.gnu.org/software/parallel/parallel_tutorial.html

ลงทะเบียนเพื่อรับรายชื่ออีเมลเพื่อรับการสนับสนุน: https://lists.gnu.org/mailman/listinfo/parallel


1
ฉันชอบขนานและพยายามแนะนำการใช้งานทุกที่ที่ทำได้ คำถามหนึ่งข้อสำหรับตัวเลือกเฉพาะของคุณ: ทำไมคุณถึงอยากแนะนำแบบฟอร์มนี้แทนparallel -N0 doit ::: {1..10}
Phillip -Zyan K Lee- Stockmann

1
The {1..10}ไม่ทำงานใน (t) csh / fish / ash และ{1..10}โครงสร้างถูก จำกัด ด้วยความยาวของบรรทัดคำสั่งดังนั้นสิ่งนี้จะไม่ทำงาน: {1..1000000000}ในขณะที่seq 1000000000จะใช้งานได้ดี แต่สำหรับสถานการณ์ส่วนใหญ่{1..10}จะทำงานได้ตามที่คาดไว้และฉันก็มักจะใช้มันเช่นกัน
Ole Tange

4

คุณสามารถใช้forลูปสไตล์ C ซึ่งมีความได้เปรียบมากกว่าเวอร์ชัน brace-expansion ( {1..5}) ที่สามารถใช้ตัวแปรเพื่อระบุจุดสิ้นสุด ทั้งสองเวอร์ชันดีกว่าการใช้ยูทิลิตี้ภายนอก ( seq)

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

ทั้งหมดในหนึ่งบรรทัด:

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

หรือคุณสามารถทำได้โดยไม่ต้องวนซ้ำ (สำหรับยูทิลิตี้และฟังก์ชันเฉพาะนี้):

xdotool click --repeat 5 --delay 50 1

0

เพียงคุณใช้คำสั่ง watch:

watch -n x <your command>

เปลี่ยน x เป็นเวลาเป็นวินาที

ตัวอย่าง:

watch -n 1 xdotool click 1 

ดังนั้น xdotool click 1 จะถูกทำซ้ำทุกๆ 1 วินาทียุติเมื่อคุณทำเสร็จแล้ว


4
ฉันคิดว่าคำถามนี้มีความเฉพาะเจาะจงในการรันคำสั่งตามจำนวนครั้งที่กำหนดไม่มากในช่วงเวลาที่กำหนด
Jacob Vlijm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.