ค้นหาเว็บไซต์

วิธีเรียกใช้หรือทำซ้ำคำสั่ง Linux ทุกๆ X วินาทีตลอดไป


ผู้ดูแลระบบมักจะต้องรันคำสั่งซ้ำๆ กันในช่วงระยะเวลาหนึ่ง บ่อยครั้งงานดังกล่าวสามารถเสร็จสิ้นได้อย่างง่ายดายด้วยคำสั่ง cron ง่ายๆ ในกรณีส่วนใหญ่ วิธีนี้น่าจะได้ผล แต่ระยะเวลาที่สั้นที่สุดที่คุณสามารถเรียกใช้คำสั่ง cron ได้คือทุกๆ 1 นาที เชื่อหรือไม่ว่าในหลายกรณีสิ่งนี้ช้าเกินไป

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้เทคนิคการเขียนสคริปต์ง่ายๆ ในการตรวจสอบหรือจับตาดูคำสั่งเฉพาะในสถานะการทำงานอย่างต่อเนื่องคล้ายกับคำสั่งบนสุด (ตรวจสอบกระบวนการและการใช้งานหน่วยความจำอย่างต่อเนื่อง) ทุกๆ 3 วินาทีตามค่าเริ่มต้น

เราจะไม่หยุดเพื่อหารือถึงสาเหตุว่าทำไมคุณจึงต้องรันคำสั่งบ่อยๆ ฉันเชื่อว่าทุกคนมีเหตุผลที่แตกต่างกันในการทำงานประจำวัน หรือแม้แต่ที่บ้านพีซีและแล็ปท็อป

1. ใช้คำสั่งนาฬิกา

Watch คือคำสั่ง Linux ที่ช่วยให้คุณสามารถรันคำสั่งหรือโปรแกรมเป็นระยะๆ และยังแสดงเอาต์พุตบนหน้าจออีกด้วย ซึ่งหมายความว่าคุณจะสามารถเห็นผลลัพธ์ของโปรแกรมได้ทันเวลา ตามค่าเริ่มต้น นาฬิกาจะรันคำสั่ง/โปรแกรมซ้ำทุกๆ 2 วินาที ช่วงเวลาสามารถเปลี่ยนแปลงได้อย่างง่ายดายเพื่อให้ตรงตามความต้องการของคุณ

ตรวจสอบการใช้หน่วยความจำ

“Watch” ใช้งานง่ายมาก ในการทดสอบ คุณสามารถเปิดเทอร์มินัล Linux ได้ทันทีและพิมพ์คำสั่งต่อไปนี้:

watch free -m

คำสั่งดังกล่าวจะตรวจสอบหน่วยความจำว่างของระบบและอัปเดตผลลัพธ์ของคำสั่งฟรีทุกๆ สองวินาที

ตามที่เห็นในผลลัพธ์ข้างต้น คุณมีส่วนหัวที่แสดงข้อมูลเกี่ยวกับช่วงเวลาการอัปเดต (จากซ้ายไปขวา) คำสั่งที่กำลังดำเนินการ และเวลาปัจจุบัน หากคุณต้องการซ่อนส่วนหัวนี้ คุณสามารถใช้ตัวเลือก -t

คำถามเชิงตรรกะถัดไปคือ จะเปลี่ยนช่วงเวลาการดำเนินการอย่างไร เพื่อจุดประสงค์ดังกล่าว คุณสามารถใช้ตัวเลือก -n ที่ระบุช่วงเวลาที่จะดำเนินการคำสั่ง ช่วงเวลานี้ระบุเป็นวินาที สมมติว่าคุณต้องการเรียกใช้ไฟล์ script.sh ทุกๆ 10 วินาที คุณสามารถทำได้ดังนี้:

watch -n 10 script.sh

หมายเหตุ หากคุณรันคำสั่งดังที่แสดงด้านบน คุณจะต้อง cd ไปยังไดเร็กทอรี (เรียนรู้เรียนรู้ตัวอย่างคำสั่ง cd 15 ตัว) โดยที่ สคริปต์ตั้งอยู่หรือระบุเส้นทางแบบเต็มไปยังสคริปต์นั้น

ตัวเลือกที่มีประโยชน์อื่นๆ ของคำสั่ง watch ได้แก่:

  1. -b – สร้างเสียงบี๊บหากการออกคำสั่งไม่เป็นศูนย์
  2. -c – ตีความลำดับสี ANSI
  3. -d – เน้นการเปลี่ยนแปลงในเอาต์พุตคำสั่ง

ตรวจสอบผู้ใช้ที่เข้าสู่ระบบ เวลาทำงาน และค่าเฉลี่ยการโหลด

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

watch uptime

หากต้องการออกจากคำสั่ง ให้กด CTRL+C

ที่นี่ คำสั่ง 'uptime' จะทำงานและแสดงผลลัพธ์ที่อัปเดตทุกๆ 2 วินาทีตามค่าเริ่มต้น

ติดตามความคืบหน้าของคำสั่งคัดลอก

ใน Linux ขณะคัดลอกไฟล์จากที่หนึ่งไปยังอีกที่หนึ่งโดยใช้คำสั่ง cp ความคืบหน้าของข้อมูลจะไม่แสดง หากต้องการดูความคืบหน้าของข้อมูลที่ถูกคัดลอก คุณสามารถใช้ watch คำสั่งพร้อมกับคำสั่ง du -s เพื่อตรวจสอบการใช้งานดิสก์แบบเรียลไทม์

cp ubuntu-15.10-desktop-amd64.iso /home/tecmint/ &
watch -n 0.1 du -s /home/tecmint/ubuntu-15.10-desktop-amd64.iso 

หากคุณคิดว่ากระบวนการข้างต้นซับซ้อนเกินกว่าจะทำสำเร็จ ฉันขอแนะนำให้คุณใช้คำสั่ง Advance copy ซึ่งจะแสดงความคืบหน้าของข้อมูลขณะคัดลอก

2. ใช้คำสั่งสลีป

Sleep มักใช้เพื่อดีบักเชลล์สคริปต์ แต่ก็มีจุดประสงค์ที่เป็นประโยชน์อื่นๆ อีกมากมายเช่นกัน ตัวอย่างเช่น เมื่อรวมกับลูป for หรือ While คุณจะได้ผลลัพธ์ที่ยอดเยี่ยมทีเดียว

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

ในกรณีที่นี่เป็นครั้งแรกที่คุณได้ยินเกี่ยวกับคำสั่ง "sleep" คำสั่งนี้ใช้เพื่อหน่วงเวลาบางอย่างตามระยะเวลาที่กำหนด ในสคริปต์ คุณสามารถใช้มันเพื่อบอกให้สคริปต์ของคุณรันคำสั่ง 1 รอเป็นเวลา 10 วินาทีแล้วรันคำสั่ง 2

ด้วยการวนซ้ำข้างต้น คุณสามารถบอกให้ bash รันคำสั่ง พักการทำงานเป็นเวลา N วินาที จากนั้นจึงรันคำสั่งอีกครั้ง

ด้านล่างนี้คุณสามารถดูตัวอย่างของทั้งสองลูป:

สำหรับตัวอย่างลูป

for i in {1..10}; do echo -n "This is a test in loop $i "; date ; sleep 5; done

ซับหนึ่งด้านบนจะรันคำสั่ง echo และแสดงวันที่ปัจจุบัน รวม 10 ครั้ง โดยพัก 5 วินาทีระหว่างการประมวลผล

นี่คือผลลัพธ์ตัวอย่าง:

This is a test in loop 1 Wed Feb 17 20:49:47 EET 2016
This is a test in loop 2 Wed Feb 17 20:49:52 EET 2016
This is a test in loop 3 Wed Feb 17 20:49:57 EET 2016
This is a test in loop 4 Wed Feb 17 20:50:02 EET 2016
This is a test in loop 5 Wed Feb 17 20:50:07 EET 2016
This is a test in loop 6 Wed Feb 17 20:50:12 EET 2016
This is a test in loop 7 Wed Feb 17 20:50:17 EET 2016
This is a test in loop 8 Wed Feb 17 20:50:22 EET 2016
This is a test in loop 9 Wed Feb 17 20:50:27 EET 2016
This is a test in loop 10 Wed Feb 17 20:50:32 EET 2016

คุณสามารถเปลี่ยนคำสั่ง echo และ date ด้วยคำสั่งหรือสคริปต์ของคุณเอง และเปลี่ยนช่วงเวลาพักเครื่องตามความต้องการของคุณ

ในขณะที่ตัวอย่างวง

while true; do echo -n "This is a test of while loop";date ; sleep 5; done

นี่คือผลลัพธ์ตัวอย่าง:

This is a test of while loopWed Feb 17 20:52:32 EET 2016
This is a test of while loopWed Feb 17 20:52:37 EET 2016
This is a test of while loopWed Feb 17 20:52:42 EET 2016
This is a test of while loopWed Feb 17 20:52:47 EET 2016
This is a test of while loopWed Feb 17 20:52:52 EET 2016
This is a test of while loopWed Feb 17 20:52:57 EET 2016

คำสั่งข้างต้นจะทำงานจนกว่าผู้ใช้จะยุติการทำงานหรือขัดจังหวะ อาจมีประโยชน์หากคุณต้องการเรียกใช้คำสั่งที่ทำงานอยู่เบื้องหลังและคุณไม่ต้องการใช้ cron

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

บทสรุป

ตัวอย่างในบทช่วยสอนนี้มีประโยชน์ แต่ไม่ได้หมายถึงการแทนที่ยูทิลิตี้ cron โดยสมบูรณ์ มันขึ้นอยู่กับคุณที่จะหาว่าอันไหนเหมาะกับคุณมากกว่า แต่ถ้าเราต้องแยกการใช้ทั้งสองเทคนิคออก ฉันจะพูดแบบนี้:

  1. ใช้ cron เมื่อคุณต้องการรันคำสั่งเป็นระยะๆ แม้ว่าระบบจะรีบูตแล้วก็ตาม
  2. ใช้วิธีที่อธิบายไว้ในบทช่วยสอนนี้สำหรับโปรแกรม/สคริปต์ที่ตั้งใจจะทำงานภายในเซสชันผู้ใช้ปัจจุบัน

เช่นเคยหากคุณมีคำถามหรือความคิดเห็นใด ๆ อย่าลังเลที่จะส่งในส่วนความคิดเห็นด้านล่าง