ฉันจะทำซ้ำคำสั่งทุกช่วงเวลาเพื่อที่จะให้ฉันเรียกใช้คำสั่งสำหรับการตรวจสอบ หรือตรวจสอบ ไดเรกทอรี?
ไม่จำเป็นต้องใช้สคริปต์ฉันต้องการเพียงคำสั่งง่ายๆที่จะดำเนินการใน terminal
ฉันจะทำซ้ำคำสั่งทุกช่วงเวลาเพื่อที่จะให้ฉันเรียกใช้คำสั่งสำหรับการตรวจสอบ หรือตรวจสอบ ไดเรกทอรี?
ไม่จำเป็นต้องใช้สคริปต์ฉันต้องการเพียงคำสั่งง่ายๆที่จะดำเนินการใน terminal
คำตอบ:
คุณสามารถใช้ watch
คำสั่งwatchถูกใช้เพื่อเรียกใช้คำสั่งที่กำหนดในช่วงเวลาปกติ
เปิด Terminal และประเภท:
watch -n x <your command>
เปลี่ยนxเป็นเวลาในหน่วยวินาทีที่คุณต้องการ
สำหรับความช่วยเหลือเพิ่มเติมโดยใช้watch
คำสั่งและตัวเลือกของตนทำงานman watch
หรือเยี่ยมชมนี้การเชื่อมโยง
ตัวอย่างเช่น:รายการต่อไปนี้จะแสดงทุก ๆ60sบนเทอร์มินัลเดียวกันเนื้อหาของไดเรกทอรีเดสก์ท็อปเพื่อให้คุณสามารถทราบว่ามีการเปลี่ยนแปลงเกิดขึ้นหรือไม่:
watch -n 60 ls -l ~/Desktop
watch
กับคำสั่งชนิด "เปิดใช้งานประวัติ" หรือไม่ ฉันชอบที่จะใช้watch
แต่บางครั้งฉันต้องการที่จะเห็นบันทึกการประหารชีวิตก่อนหน้านี้เช่นกันแทนที่จะเป็นแค่การบันทึกครั้งสุดท้าย และใช่ฉันรู้ว่าฉันสามารถใช้สคริปต์ ( while true
) เพื่อทำสิ่งนี้ได้ แต่การใช้watch
utilitiy นั้นสะอาดกว่ามาก!
คุณยังสามารถใช้คำสั่งนี้ในเทอร์มินัลนอกเหนือจากคำตอบของ nux:
while true; do <your_command>; sleep <interval_in_seconds>; done
ตัวอย่าง
while true; do ls; sleep 2; done
คำสั่งนี้จะพิมพ์เอาต์พุตของls
ช่วงเวลา 2 วินาที
ใช้Ctrl+ Cเพื่อหยุดกระบวนการ
มีข้อบกพร่องเล็กน้อย watch
watch
จะตีความลำดับสี ANSI ผ่านอักขระเลี่ยงโดยใช้-c
หรือ--color
ตัวเลือก ยกตัวอย่างเช่นการส่งออกของpygmentize
จะทำงาน ls --color=auto
แต่มันจะล้มเหลวในสถานการณ์ข้างต้นอาจปรากฏเป็นตัวเลือกที่ดีกว่า
watch
มีอยู่สำหรับสิ่งนี้มันไร้ประโยชน์นิดหน่อยที่ฉันจะบอกว่า
watch
เป็นสิ่งที่ดีในกรณีส่วนใหญ่ นั่นคือเหตุผลที่ฉันพูดถึง "นอกเหนือจากคำตอบของ nux" ที่จุดเริ่มต้น แต่มีปัญหาเล็กน้อยกับwatch
ตัวอย่างเช่น One ไม่สามารถใช้คำสั่ง aliasedwatch
ได้ ใช้ตัวอย่างll
ซึ่งเป็นนามแฝงแต่ไม่สามารถใช้กับls -laF
watch
นอกจากนี้ในกรณีที่ผลของคำสั่งใด ๆ watch
ที่ค่อนข้างนานคุณจะมีปัญหาในการเลื่อนการใช้ ในกรณีพิเศษเหล่านี้คำตอบนี้อาจเป็นตัวเลือกที่ดีกว่า
watch
อย่างน้อยอนุญาต-c
หรือ--color
ตัวเลือกสำหรับผลลัพธ์ colorized
while sleep x
ดีกว่า - ฆ่าง่ายกว่า
watch
กันที่มันเก็บประวัติคำสั่ง
แค่ต้องการที่จะเลือกคำตอบของsouravcและnux :
watch
ทำงานได้อย่างสมบูรณ์บน Ubuntu คุณอาจต้องการหลีกเลี่ยงถ้าคุณต้องการให้ "Unix-fu" ของคุณบริสุทธิ์ - บน FreeBSD ตัวอย่างเช่น watch คือคำสั่งให้ "สอดแนมในบรรทัด tty อื่น"while true; do command; sleep SECONDS; done
นอกจากนี้ยังมีข้อแม้ - คำสั่งของคุณอาจจะยากที่จะฆ่าโดยใช้CTR + C คุณอาจต้องการwhile sleep SECONDS; do command; done
- ไม่เพียง แต่สั้นกว่า แต่ยังง่ายต่อการขัดจังหวะ ข้อแม้คือมันจะหลับก่อนแล้วจึงรันคำสั่งของคุณดังนั้นคุณจะต้องรอSECONDS
ก่อนที่คำสั่งแรกจะเกิดขึ้นsleep
ในwhile
วง? ฉันไม่พบความแตกต่างเลย Ctrl + C ก็วนลูปทันทีไม่ว่าจะเกิดอะไรขึ้น
command
และและมีเพียงทำลายถ้าคุณฆ่าsleep
true
เสียงเหมือนงานที่เหมาะสำหรับcron
daemon ซึ่งอนุญาตให้รันคำสั่งเป็นระยะ รันcrontab -e
คำสั่งเพื่อเริ่มแก้ไขการกำหนดค่า cron ของผู้ใช้ รูปแบบของมันจะถูกบันทึกไว้ในcrontab (5) โดยทั่วไปคุณมีฟิลด์ที่คั่นด้วยช่องว่างห้าช่องตามด้วยคำสั่ง:
The time and date fields are:
field allowed values
----- --------------
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sunday, or use names)
ตัวอย่างเช่นหากคุณต้องการเรียกใช้สคริปต์ Python ในทุกวันอังคารเวลา 11.00 น.:
0 11 * * 1 python ~/yourscript.py
@reboot
นอกจากนี้ยังมีบางชื่อพิเศษที่เปลี่ยนเวลาเช่น มีประโยชน์มากถ้าคุณต้องการสร้างไดเรกทอรีชั่วคราว จาก crontab ของฉัน (แสดงด้วยcrontab -l
):
# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
cron
วิ่งตามเบื้องหลังมากกว่าในเทอร์มินัล
หากคุณกำลังตรวจสอบระบบไฟล์นั้นinotifywait
จะยอดเยี่ยมและแน่นอนจะเพิ่มการโหลดน้อยลงในระบบของคุณ
ตัวอย่าง:
ในเทอร์มินัลที่1พิมพ์คำสั่งนี้:
$ inotifywait .
จากนั้นในเทอร์มินัลที่2คำสั่งใด ๆ ที่มีผลต่อไดเรกทอรีปัจจุบัน
$ touch newfile
จากนั้นในเทอร์มินัลดั้งเดิมจะรอการแจ้งเตือนจะตื่นขึ้นมาและรายงานเหตุการณ์
./ CREATE newfile2
หรือเป็นวง
$ while true ; do inotifywait . ; done
Setting up watches.
Watches established.
./ OPEN newfile2
Setting up watches.
Watches established.
./ OPEN newfile2
Setting up watches.
Watches established.
./ DELETE newfile
Setting up watches.
Watches established.
./ CREATE,ISDIR newdir
Setting up watches.
Watches established.
grep something InALogFile|less
นั้นเป็นสคริปต์หรือไม่
.
ฉันไม่สามารถออกคำสั่ง
-m
เพื่อตรวจสอบอย่างต่อเนื่องโดยไม่ต้องวนซ้ำ
คุณสามารถสร้างrepeat
คำสั่งของคุณเองทำตามขั้นตอนดังต่อไปนี้ เครดิตที่นี่ :
ก่อนอื่นให้เปิด.bash_aliases
ไฟล์ของคุณ:
$ xdg-open ~/.bash-aliases
ประการที่สองวางบรรทัดเหล่านี้ที่ด้านล่างของไฟล์และบันทึก:
repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
"$@"
done
}
ประการที่สามปิดและเปิดเทอร์มินัลของคุณอีกครั้งหรือพิมพ์:
$ source ~/.bash_aliases
และอื่น ๆ ! ตอนนี้คุณสามารถใช้มันได้เช่นนี้:
$ repeat 5 echo Hello World !!!
หรือ
$ repeat 5 ./myscript.sh
คุณสามารถใช้ crontab เรียกใช้คำสั่งcrontab -e
และเปิดด้วยโปรแกรมแก้ไขข้อความที่คุณต้องการจากนั้นเพิ่มบรรทัดนี้
*/10 * * * * /path-to-your-command
สิ่งนี้จะรันคำสั่งของคุณทุก ๆ 10 นาที
* */4 * * * /path-to-your-command
สิ่งนี้จะรันคำสั่งของคุณทุก 4 ชั่วโมง
$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done
Xจำนวนครั้งที่จะทำซ้ำ
Yเวลารอที่จะทำซ้ำ
ตัวอย่าง:
$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
ข้อกังวลอีกประการหนึ่งของวิธีการ "เฝ้าดู" ที่เสนอข้างต้นก็คือมันจะแสดงผลลัพธ์เฉพาะเมื่อกระบวนการเสร็จสิ้น "date; sleep 58; date" จะแสดง 2 วันหลังจาก 59 วินาทีเท่านั้น ... หากคุณเริ่มบางสิ่งบางอย่างที่ทำงานเป็นเวลา 4 นาทีนั่นจะแสดงเนื้อหาหลายหน้าช้าคุณจะไม่เห็นมันจริงๆ
ในทางตรงกันข้ามความกังวลกับวิธี "ในขณะที่" คือการที่ไม่คำนึงถึงระยะเวลาของงานในการพิจารณา
while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done
ด้วยสิ่งนี้สคริปต์จะทำงานบางครั้งทุกนาทีบางครั้งอาจใช้เวลา 1m40 ดังนั้นแม้ว่า cron จะสามารถเรียกใช้ได้ทุกนาทีที่นี่จะไม่
ดังนั้นเมื่อต้องการดูเอาต์พุตบนเชลล์ในขณะที่มันถูกสร้างขึ้นและรอเวลาคำขอที่แน่นอนคุณต้องดูเวลาก่อนและหลังและวนลูปในขณะที่
สิ่งที่ต้องการ:
while ( true ); do
echo Date starting `date`
before=`date +%s`
sleep `echo $(( ( RANDOM % 30 ) + 1 ))`
echo Before waiting `date`
after=`date +%s`
DELAY=`echo "60-($after-$before)" | bc`
sleep $DELAY
echo Done waiting `date`
done
สิ่งนี้จะเอาท์พุทนี้:
อย่างที่คุณเห็นคำสั่งรันทุกนาที:
Date starting Mon Dec 14 15:49:34 EST 2015
Before waiting Mon Dec 14 15:49:52 EST 2015
Done waiting Mon Dec 14 15:50:34 EST 2015
Date starting Mon Dec 14 15:50:34 EST 2015
Before waiting Mon Dec 14 15:50:39 EST 2015
Done waiting Mon Dec 14 15:51:34 EST 2015
ดังนั้นเพียงแค่แทนที่echo $(( ( RANDOM % 30 ) + 1 ))
คำสั่ง " sleep " ด้วยสิ่งที่คุณต้องการและจะรันบนเทอร์มินัล / เชลล์ทุกนาที หากคุณต้องการกำหนดการอื่นเพียงแค่เปลี่ยน "60" วินาทีกับสิ่งที่คุณต้องการ
เวอร์ชันที่สั้นกว่าโดยไม่มีบรรทัดดีบัก:
while ( true ); do
before=`date +%s`
sleep `echo $(( ( RANDOM % 30 ) + 1 ))` # Place you command here
after=`date +%s`
DELAY=`echo "60-($after-$before)" | bc`
sleep $DELAY
done
watch -n 1 'echo $COLUMNS'
และwatch -n 1 echo $COLUMNS
เมื่อปรับขนาดเทอร์มินัล - ตัวเก่าจะถูกขยายทุกวินาที แต่ตัวหลังจะถูกขยายเพียงครั้งเดียวก่อนที่จะwatch
เริ่ม