ทำซ้ำคำสั่งอัตโนมัติใน Linux


303

เป็นไปได้ในบรรทัดคำสั่ง Linux ที่มีคำสั่งทำซ้ำทุก ๆnวินาทีหรือไม่?

พูดว่าฉันใช้การนำเข้าแล้วและกำลังทำอยู่

ls -l

เพื่อตรวจสอบว่าขนาดไฟล์เพิ่มขึ้นหรือไม่ ฉันต้องการมีคำสั่งให้ทำซ้ำนี้โดยอัตโนมัติ

คำตอบ:


541

ดูทุก 5 วินาที ...

watch -n 5 ls -l

หากคุณต้องการให้มีการยืนยันการเปลี่ยนแปลงด้วยภาพให้ผนวก--differencesก่อนlsคำสั่ง

ตามหน้า man OSX ยังมี

ตัวเลือก - การสะสมทำให้การเน้น "เหนียว" นำเสนอการแสดงผลการทำงานของทุกตำแหน่งที่เคยมีการเปลี่ยนแปลง อ็อพชัน -t or - no-title ปิดส่วนหัวที่แสดงช่วงเวลาคำสั่งและเวลาปัจจุบันที่ด้านบนของจอแสดงผลรวมถึงบรรทัดว่างต่อไปนี้

พบหน้า man Linux / Unix ได้ที่นี่


4
Nice - ไม่ดีเกี่ยวกับเรื่องนี้ไม่ได้ผนวกผลลัพธ์ไปยังบรรทัดคำสั่ง
Marty Wallace

1
เพิ่มตัวเลือกในการตอบที่ช่วยให้สามารถเน้นการเปลี่ยนแปลงได้
Rawkode

3
โปรดทราบว่าคุณต้องหลีกเลี่ยงอักขระพิเศษที่เป็นส่วนหนึ่งของคำสั่งที่คุณกำลังรับชมตัวอย่างเช่น: watch mysql dbname -e \"show processlist\;\"
pfrenssen

11
brew install watch
Josh Unger

1
ไม่ได้ติดตั้งนาฬิกาใน mac os X 10.10
João Nunes

118
while true; do
    sleep 5
    ls -l
done

10
watchยังมีผลข้างเคียงที่โชคร้ายของการล้างหน้าจอดังนั้นบางครั้งการวนซ้ำก็มีประโยชน์ สิ่งที่ใช้ขึ้นอยู่กับรูปแบบที่ต้องการของเอาต์พุต
William Pursell

ฉันมักจะทำวง แต่ทำในบรรทัดเดียว ดูดีกว่ามาก แต่ฉันจะต้องสลับไปที่
Don Branson

1
@MartyWallace ซึ่งสามารถทำได้ด้วยบรรทัดคำสั่ง (ห่วงขณะที่)
keyser

มันน่าสังเกตว่าคุณสามารถใช้--differencesเพื่อให้พวกเขาเน้น (ถ้าคุณกังวลเกี่ยวกับการทาสีของอาคาร)
Rawkode

watchนี้จะดีกว่า watch -n 1 echo ${RANDOM}นาฬิกาไม่ทำงานตัวอย่างเช่นเมื่อคุณต้องการจำนวนสุ่มสร้างขึ้นในแต่ละภาวนาเช่น การสุ่มจะถูกเรียกเพียงครั้งเดียว
Marcin

92

"เฝ้าดู" ไม่อนุญาตให้ใช้เศษเสี้ยวของวินาทีใน Busybox ขณะที่ "sleep" ทำงาน หากสิ่งนั้นมีความสำคัญกับคุณลองสิ่งนี้:

while true; do ls -l; sleep .5; done

1
สิ่งนี้มีประโยชน์สำหรับถ้าคุณต้องการไพพ์เอาท์พุทที่ใดที่หนึ่ง (เช่น bar aint recursive)
Stephen Smith

1
ขอบคุณ สิ่งนี้ใช้ได้กับคอนโซลของ busybox ที่ไม่มีคำสั่ง watch ฉันใช้มันเพื่อวัดเวลาการทำงานของระบบของฉัน: ในขณะที่จริง ทำเวลา นอน 1 เสร็จแล้ว
Santiago Villafuerte

FWIW ในเวอร์ชันเก่าของ busybox (v1.11.2) ฉันติดอยู่กับที่ไม่มีนาฬิกาและการนอนหลับไม่สนับสนุนเศษส่วน แต่คุณสามารถใช้ sleep 1 ได้สำเร็จ
moodboom

นี่เป็นวิธีที่ยอดเยี่ยมในการเรียกใช้งานใน cygwin
แบรดลีย์เมื่อ

34

sleep0ผลตอบแทนที่แล้ว เช่นนี้ฉันกำลังใช้:

while sleep 3 ; do ls -l ; done

นี่สั้นกว่าโซลูชันของ mikhail เล็กน้อย ข้อเสียเปรียบเล็กน้อยคือมันหลับก่อนที่จะรันคำสั่งเป้าหมายเป็นครั้งแรก


18

หากคำสั่งมีอักขระพิเศษบางอย่างเช่นไพพ์และเครื่องหมายคำพูดคำสั่งจะต้องถูกเสริมด้วยคำพูด ตัวอย่างเช่นหากต้องการทำซ้ำls -l | grep "txt"คำสั่ง watch ควรเป็น:

watch -n 5 'ls -l | grep "txt"'


ผมมีปัญหาในการดูการทำงานอย่างถูกต้องในการแสดงออกประปา แต่หลังจากที่ได้อ่านนี้ฉันอาจจะแก้ไขมัน :)
Elysium กลืน

13

การรันคำสั่งเป็นระยะโดยไม่มี cron เป็นไปได้เมื่อเราไปด้วย whileเป็นไปได้เมื่อเราไปด้วย

เป็นคำสั่ง:

while true ; do command ; sleep 100 ; done &
[ ex: # while true;  do echo `date` ; sleep 2 ; done & ]

ตัวอย่าง:

while true
do echo "Hello World"
sleep 100
done &

อย่าลืมคนสุดท้าย&เพราะมันจะทำให้วงของคุณอยู่ในพื้นหลัง แต่คุณต้องค้นหารหัสกระบวนการด้วยคำสั่ง "ps -ef | grep your_script" จากนั้นคุณต้องฆ่ามัน ดังนั้นโปรดเพิ่ม '&' เมื่อคุณเรียกใช้สคริปต์

# ./while_check.sh &

นี่คือลูปเดียวกันกับสคริปต์ สร้างไฟล์ "while_check.sh" และวางไว้ใน:

#!/bin/bash
while true; do 
    echo "Hello World" # Substitute this line for whatever command you want.
    sleep 100
done

จากนั้นเรียกใช้โดยพิมพ์ bash ./while_check.sh &


ไม่ใช่ & สุดท้ายเหมือนกับการเขียนคำสั่งโดยไม่มี & สิ้นสุด แต่เรียกสคริปต์ด้วย &: bash ./while_check.sh &?
ransh

@ransh: เราสามารถเรียกใช้สคริปต์. / while_check.sh & เพื่อให้เราได้รับ id กระบวนการทันทีเมื่อเราเพิ่มสคริปต์ & ในและเพียงแค่เรียกใช้สคริปต์โดยไม่ต้อง & เราไม่ได้รับ id กระบวนการใด ๆ แต่มันจะทำงาน พื้นหลังในขณะที่ฉันแก้ไขเราต้องใช้คำสั่ง ps เพื่อรับรหัสกระบวนการถ้าเราจำเป็นต้องหยุดสคริปต์
Ranjithkumar T

หากคุณต้องการคุณสามารถปรับเปลี่ยนสคริปต์เป็นecho $!หลังจากกระบวนการพื้นหลังแต่ละกระบวนการเปิดตัวนั่นคือ PID ของกระบวนการลูกล่าสุดที่เปิดตัวในพื้นหลัง
Jonathan Leffler

echo `date` dateเป็นเพียงวิธีที่ยากจนและรถเล็กน้อยที่จะเขียนเพียง (ข้อผิดพลาดได้จะทำอย่างไรกับการขาดการอ้างของการโต้แย้งไปecho.) ดูเพิ่มเติมการใช้งานไร้ประโยชน์ echo
tripleee


6

หากคุณต้องการหลีกเลี่ยง "การดริฟท์" หมายถึงคุณต้องการให้คำสั่งดำเนินการทุก ๆ N วินาทีโดยไม่คำนึงว่าคำสั่งนั้นใช้เวลานานเท่าใด (สมมติว่าใช้เวลาน้อยกว่า N วินาที) นี่คือ bash ที่จะทำซ้ำคำสั่งทุก 5 วินาทีด้วย ความแม่นยำที่สอง (และจะพิมพ์คำเตือนหากไม่สามารถติดตามได้):

PERIOD=5

while [ 1 ]
do
    let lastup=`date +%s`
    # do command
    let diff=`date +%s`-$lastup
    if [ "$diff" -lt "$PERIOD" ]
    then
        sleep $(($PERIOD-$diff))
    elif [ "$diff" -gt "$PERIOD" ]
    then
        echo "Command took longer than iteration period of $PERIOD seconds!"
    fi
done

มันอาจยังลอยอยู่เล็กน้อยเนื่องจากการนอนหลับนั้นแม่นยำเพียงหนึ่งวินาที คุณสามารถปรับปรุงความแม่นยำนี้ได้โดยการใช้คำสั่ง date


ขอบคุณ .. แต่ฉันมีคำถาม 2 ข้อ 1- บันทึกรหัสนั้นไว้ที่ไหน? กล่าวอีกนัยหนึ่งฉันควรใส่ไฟล์ใดที่มีสคริปต์นั้นในพา ธ ที่ทำให้มันทำงานโดยอัตโนมัติ! 2- วิธีรวมไฟล์ php ใน (คำสั่ง # do) แทนที่จะพิมพ์รหัสทั้งหมดของฉันที่นั่นหรือไม่
Hossam

1
ฉันขอแนะนำให้คุณค้นคว้าข้อมูลเกี่ยวกับ bash script เพื่อให้คุณสามารถเข้าใจพื้นฐานของวิธีการรันสคริปต์เหล่านี้และอื่น ๆ
mcote

4

หากคุณต้องการทำบางสิ่งบางอย่างตามจำนวนที่กำหนดคุณสามารถทำสิ่งนี้ได้ตลอดเวลา:

repeat 300 do my first command here && sleep 1.5

8
สำหรับfor x in {1..300} ; do คำสั่ง bash do||break;sleep 1.5; done
Jasen

4

คุณสามารถเรียกใช้สิ่งต่อไปนี้และกรองขนาดได้เท่านั้น หากไฟล์ของคุณถูกเรียกว่า somefilenameคุณสามารถทำดังต่อไปนี้

while :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done

หนึ่งในความคิดมากมาย


2

เพื่อลดการเบี่ยงเบนได้ง่ายขึ้นให้ใช้:

while :; do sleep 1m & some-command; wait; done

จะยังคงมีจำนวนเล็กน้อยของการดริฟท์เนื่องจากเวลาของ bash ในการรันโครงสร้างลูปและคำสั่ง sleep เพื่อดำเนินการจริง

คำใบ้: ':' จะมีค่าเท่ากับ 0 นั่นคือจริง


1
watch -n 5 'ls -l 

จะเรียกใช้ls -lคำสั่งหลังจากทุก 5 วินาที

ผลลัพธ์: -

Every 5.0s: ls -l                                                                                                      Fri Nov 17 16:28:25 2017

total 169548
-rw-rw-r--  1 sachin sachin     4292 Oct 18 12:16 About_us_Admission.doc
-rw-rw-r--  1 sachin sachin      865 Oct 13 15:26 About_us_At_glance.doc
-rw-rw-r--  1 sachin sachin     1816 Oct 13 16:11 About_us_Principle.doc
-rw-rw-r--  1 sachin sachin     1775 Oct 13 15:59 About_us_Vission_mission.doc
-rw-rw-r--  1 sachin sachin     1970 Oct 13 16:41 Academic_Middle_school.doc
-rw-rw-r--  1 sachin sachin      772 Oct 16 16:07 academics_High_School.doc
-rw-rw-r--  1 sachin sachin      648 Oct 16 13:34 academics_pre_primary.doc
-rw-rw-r--  1 sachin sachin      708 Oct 16 13:39 academics_primary.doc
-rwxrwxr-x  1 sachin sachin     8816 Nov  1 12:10 a.out
-rw-rw-r--  1 sachin sachin    23956 Oct 23 18:14 Ass1.c++
-rw-rw-r--  1 sachin sachin      342 Oct 23 22:13 Ass2.doc
drwxrwxr-x  2 sachin sachin     4096 Oct 19 10:45 Backtracking
drwxrwxr-x  3 sachin sachin     4096 Sep 23 20:09 BeautifulSoup
drwxrwxr-x  2 sachin sachin     4096 Nov  2 00:18 CL_1
drwxrwxr-x  2 sachin sachin     4096 Oct 23 20:16 Code
drwxr-xr-x  2 sachin sachin     4096 Nov 15 12:05 Desktop
-rw-rw-r--  1 sachin sachin        0 Oct 13 23:12 doc
drwxr-xr-x  4 sachin sachin     4096 Nov  6 21:18 Documents
drwxr-xr-x 27 sachin sachin    12288 Nov 17 13:23 Downloads
-rw-r--r--  1 sachin sachin     8980 Sep 19 23:58 examples.desktop

1

โซลูชันรัดกุมซึ่งมีประโยชน์อย่างยิ่งหากคุณต้องการรันคำสั่งซ้ำ ๆ จนกว่าจะล้มเหลวและให้คุณเห็นเอาต์พุตทั้งหมด

while ls -l; do
    sleep 5
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.