วิธีใช้ at และแบตช์บน Linux เพื่อกำหนดเวลาคำสั่ง

หากคุณต้องการกำหนดเวลางาน Linux ที่จะเกิดขึ้นเพียงครั้งเดียว cron ก็เกินความสามารถ at family of commands คือสิ่งที่คุณต้องการ! และถ้าคุณต้องการรันกระบวนการเฉพาะเมื่อระบบของคุณมีทรัพยากรว่าง คุณสามารถใช้แบทช์ได้

วิธีกำหนดเวลางาน Linux

cron daemon รักษา รายการงานที่ทำในช่วงเวลาที่กำหนด. งานและโปรแกรมเหล่านี้ทำงานในพื้นหลังตามเวลาที่กำหนด สิ่งนี้ให้ความยืดหยุ่นที่ยอดเยี่ยมแก่คุณสำหรับการจัดกำหนดการงานที่ต้องทำซ้ำ ไม่ว่าคุณจะต้องเรียกใช้งานทุกๆ ชั่วโมง ในเวลาที่กำหนดในแต่ละวัน หรือเดือนละครั้งหรือปี คุณก็ตั้งค่าใน cron ได้

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

สำหรับลีนุกซ์ หากคุณกำลังประสบปัญหา เกือบจะรับประกันได้ว่าจะมีคนอื่นที่ประสบปัญหาเช่นกัน โชคดีเพราะระบบปฏิบัติการที่เหมือน Unix มีมานานแล้ว จึงมีโอกาสที่ดีที่ใครบางคนจะสร้างวิธีแก้ไขปัญหาให้กับคุณ

สำหรับปัญหาที่กล่าวข้างต้นก็มีและเรียกกันว่า

การติดตั้ง at Command

เราต้องติดตั้งบน Ubuntu 18.04 และ Manjaro 18.1.0 (ติดตั้งบน Fedora 31 แล้ว)

ในการติดตั้งบน Ubuntu ให้ใช้คำสั่งนี้:

sudo apt-get install at

หลังจากการติดตั้งเสร็จสิ้น คุณสามารถเริ่มต้น at daemon ด้วยคำสั่งนี้:

sudo systemctl enable --now atd.service

ดิ

บน Manjaro คุณติดตั้งที่ ด้วยคำสั่งนี้:

sudo pacman -Sy at

ดิ

หลังจากการติดตั้งเสร็จสิ้น ให้พิมพ์คำสั่งนี้เพื่อเริ่มต้น at daemon:

sudo systemctl enable --now atd.service

ดิ

บนการแจกจ่ายใดๆ คุณสามารถพิมพ์คำสั่งนี้เพื่อให้แน่ใจว่า atd daemon กำลังทำงานอยู่:

ps -e | grep atd

ดิ

วิธีใช้คำสั่ง at แบบโต้ตอบ

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

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

at
at banana

การใช้ . อย่างไม่ถูกต้อง

วันที่และเวลาสามารถชัดเจนหรือสัมพันธ์กัน ตัวอย่างเช่น สมมติว่าคุณต้องการให้คำสั่งดำเนินการหนึ่งนาทีต่อจากนี้ at รู้ว่า “ตอนนี้” หมายถึงอะไร คุณจึงสามารถใช้ now และเพิ่มนาทีเข้าไปได้ เช่น

at now + 1 minute

ดิ

ที่ พิมพ์ข้อความและพร้อมท์ และรอให้คุณพิมพ์คำสั่งที่คุณต้องการกำหนดเวลา ก่อนอื่น ให้พิจารณาข้อความดังที่แสดงด้านล่าง:

  วิธีเปิดใช้งานการตรวจสอบสิทธิ์สองปัจจัยบน Linux เพื่อเข้าสู่ระบบ

ดิ

มันบอกคุณเมื่อเปิดตัวอินสแตนซ์ของ sh เชลล์และ will เรียกใช้คำสั่งภายในนั้น. คำสั่งของคุณจะไม่ถูกดำเนินการใน Bash shell ซึ่งเข้ากันได้กับ sh shell แต่มีชุดคุณสมบัติที่สมบูรณ์ยิ่งขึ้น

หากคำสั่งหรือสคริปต์ของคุณพยายามใช้ฟังก์ชันหรือสิ่งอำนวยความสะดวกที่ Bash มีให้ แต่ sh ไม่ทำ คำสั่งหรือสคริปต์ของคุณจะไม่สำเร็จ

ง่ายต่อการทดสอบว่าคำสั่งหรือสคริปต์ของคุณจะทำงานใน sh ใช้คำสั่ง sh เพื่อเริ่ม sh เชลล์:

sh

ดิ

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

หากต้องการกลับไปที่เปลือก Bash ให้พิมพ์คำสั่ง exit:

exit

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

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

ระบบ Linux (ส่วนใหญ่) จำนวนมากไม่มีระบบอีเมลภายใน เนื่องจากแทบไม่มีความจำเป็นเลย ที่มักใช้ระบบเช่น ส่งอีเมล์ หรือ postfix. หากระบบของคุณไม่มีระบบอีเมลภายใน คุณสามารถให้สคริปต์เขียนไปยังไฟล์หรือเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์เพื่อเพิ่มการบันทึก

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

ตอนนี้ได้เวลาพิมพ์คำสั่งที่ สำหรับตัวอย่างนี้ เราจะใช้ไฟล์สคริปต์ขนาดเล็กชื่อ sweep.sh ซึ่งลบไฟล์ *.bak, *.tmp และ *.o พิมพ์พาธไปยังคำสั่งดังที่แสดงด้านล่าง แล้วกด Enter

ดิ

พร้อมท์คำสั่งอื่นปรากฏขึ้น และคุณสามารถเพิ่มคำสั่งได้มากเท่าที่คุณต้องการ โดยปกติแล้วจะสะดวกกว่าที่จะมีคำสั่งของคุณในสคริปต์เดียวและเรียกสคริปต์นั้นจากภายในที่

กด Ctrl+D เพื่อบอกว่าคุณเพิ่มคำสั่งเสร็จแล้ว ในงานแสดง , ซึ่งหมายความว่า สิ้นสุดการส่งสัญญาณ. คุณจะได้รับแจ้งหมายเลขงานและเวลาที่งานมีกำหนดเรียกใช้ดังที่แสดงด้านล่าง:

คำยืนยันของ

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

mail

ดิ

หากไม่มีจดหมาย คุณต้องถือว่าประสบความสำเร็จ แน่นอน ในกรณีนี้ คุณสามารถตรวจสอบและดูว่าไฟล์ *.bak , *.tmp และ *.o ถูกลบเพื่อยืนยันว่าคำสั่งทำงานได้หรือไม่

พิมพ์สิ่งต่อไปนี้เพื่อเรียกใช้สิ่งทั้งหมดอีกครั้ง:

at now + 1 minute

ดิ

หลังจากหนึ่งนาที ให้พิมพ์ข้อความต่อไปนี้เพื่อตรวจสอบจดหมายของคุณอีกครั้ง:

mail

ดิ

เฮ้ เราได้รับจดหมายแล้ว! เมื่อต้องการอ่านข้อความหมายเลขหนึ่ง ให้กด 1 แล้วกด Enter

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

กด D+Enter เพื่อลบอีเมล และ Q+Enter เพื่อออกจากโปรแกรมเมล

รูปแบบวันที่และเวลา

คุณมีความยืดหยุ่นมากในเรื่องรูปแบบเวลาที่คุณสามารถใช้ได้ นี่คือตัวอย่างบางส่วน:

วิ่งเวลา 11.00 น.:

at 11:00 AM

วิ่งเวลา 11:00 น. พรุ่งนี้:

at 11:00 AM tomorrow

วิ่งเวลา 11.00 น. ของวันนี้ในสัปดาห์หน้า:

at 11:00 AM next week

เรียกใช้ในเวลานี้ วันนี้ สัปดาห์หน้า:

at next week

วิ่งเวลา 11:00 น. วันศุกร์หน้า:

at 11:00 AM next fri

วิ่งในเวลานี้ในวันศุกร์หน้า:

at next fri

วิ่งเวลา 11.00 น. ของวันนี้ เดือนหน้า:

at 11:00 AM next month

วิ่งเวลา 11.00 น. ในวันที่ระบุ:

at 11:00 AM 3/15/2020

วิ่ง 30 นาทีจากนี้:

at now + 30 minutes

เรียกใช้สองชั่วโมงจากนี้:

at now + 2 hours

วิ่งในเวลานี้ในวันพรุ่งนี้:

at tomorrow

วิ่งในเวลานี้ในวันพฤหัสบดี:

at thursday

วิ่งเวลา 00:00 น.:

at midnight

วิ่งเวลา 12.00 น.:

at noon

หากคุณเป็นชาวอังกฤษ คุณสามารถกำหนดเวลาให้คำสั่งทำงานในเวลาน้ำชา (16:00 น.):

at teatime

ดูคิวงาน

คุณสามารถพิมพ์คำสั่ง atq เพื่อดูคิวของงานที่กำหนดเวลาไว้ดังที่แสดงด้านล่าง

  วิธีการติดตั้งเบราว์เซอร์ Vivaldi บน Linux

ผลลัพธ์จาก

สำหรับแต่ละคำสั่งในคิว atq จะแสดงข้อมูลต่อไปนี้:

รหัสงาน
วันที่กำหนด
ตารางเวลา
คิวงานเข้า คิวจะมีป้ายกำกับ “a”, “b” เป็นต้น งานปกติที่คุณกำหนดเวลาด้วยเมื่อไปที่คิว “a” ในขณะที่งานที่คุณกำหนดเวลาด้วยชุดงาน (ซึ่งจะกล่าวถึงในบทความนี้) จะเข้าสู่คิว “b”
คนที่กำหนดเวลางาน

ใช้ at บน Command Line

คุณไม่จำเป็นต้องใช้งานแบบโต้ตอบ คุณยังสามารถใช้คำสั่งนี้ได้ ทำให้ง่ายต่อการใช้งานภายในสคริปต์

คุณสามารถไพพ์คำสั่งได้ที่ เช่นนี้:

echo "sh ~/sweep.sh" | at 08:45 AM

หนึ่ง

งานได้รับการยอมรับและกำหนดเวลาโดย ณ และหมายเลขงานและวันที่ดำเนินการจะถูกรายงานเหมือนเมื่อก่อน

การใช้ at กับไฟล์คำสั่ง

คุณยังสามารถจัดเก็บลำดับของคำสั่งในไฟล์แล้วส่งต่อไปที่ ไฟล์นี้อาจเป็นไฟล์ข้อความธรรมดาของคำสั่ง โดยไม่จำเป็นต้องเป็นสคริปต์ที่เรียกใช้งานได้

คุณสามารถใช้ตัวเลือก -f (ไฟล์) ด้วยวิธีต่อไปนี้เพื่อส่งชื่อไฟล์ไปที่:

at now + 5 minutes -f clean.txt

หนึ่ง

คุณสามารถบรรลุผลเช่นเดียวกันหากคุณเปลี่ยนเส้นทางไฟล์ไปที่:

at now + 5 minutes 

หนึ่ง

Removing Scheduled Jobs from the Queue

To remove a scheduled job from the queue, you can use the atrm command. If you want to see the queue first to find the number of the job you want to remove, you can use atq . Then, use that job number with atrm, as shown below:

atq
atrm 11
atq

วิธีดูรายละเอียดงาน

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

ขั้นแรก เราจะใช้ atq เพื่อค้นหาหมายเลขงาน:

atq

ผลลัพธ์จาก

ตอนนี้ เราจะใช้งานหมายเลข 13 ด้วยตัวเลือก -c:

at -c 13

ดิ

นี่คือรายละเอียดของข้อมูลที่เราได้รับเกี่ยวกับงานคืน:

บรรทัดแรก: สิ่งนี้บอกเราว่าคำสั่งจะทำงานภายใต้ sh เชลล์
บรรทัดที่สอง: เราเห็นว่าคำสั่งต่างๆ จะทำงานด้วยทั้งผู้ใช้และ ID กลุ่ม 1000 ค่าเหล่านี้เป็นค่าสำหรับบุคคลที่รันคำสั่ง at
บรรทัดที่สาม: ผู้ที่ได้รับอีเมลใด ๆ ที่ส่งมา
บรรทัดที่สี่: The หน้ากากผู้ใช้ คือ 22 นี่คือมาสก์ที่ใช้ตั้งค่าการอนุญาตเริ่มต้นสำหรับไฟล์ใด ๆ ที่สร้างขึ้นในเซสชัน sh นี้ มาสก์ถูกลบออกจาก 666 ซึ่งทำให้เราได้ 644 (เทียบเท่าฐานแปดของ rw-r--r--)
ข้อมูลที่เหลืออยู่: ส่วนใหญ่เป็นตัวแปรสภาพแวดล้อม

ผลลัพธ์จาก

ผลการทดสอบ การทดสอบจะตรวจสอบเพื่อให้แน่ใจว่าสามารถเข้าถึงไดเร็กทอรีการดำเนินการได้ หากไม่สามารถทำได้ จะเกิดข้อผิดพลาดขึ้น และการดำเนินการงานจะถูกยกเลิก
คำสั่งที่จะดำเนินการ สิ่งเหล่านี้อยู่ในรายการ และเนื้อหาของสคริปต์ที่กำหนดเวลาไว้จะปรากฏขึ้น โปรดทราบว่าแม้ว่าสคริปต์ในตัวอย่างด้านบนของเราจะถูกเขียนให้ทำงานภายใต้ Bash แต่จะยังคงทำงานอยู่ใน sh เชลล์

คำสั่งแบทช์

คำสั่งแบทช์ ทำงานเหมือนกัน ถึงคำสั่ง at แต่มีความแตกต่างที่สำคัญสามประการ:

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

เมื่อคุณใช้คำสั่งแบตช์ คุณจะเรียกมันด้วยชื่อโดยไม่มีพารามิเตอร์บรรทัดคำสั่งดังนี้:

batch

ดิ

ถัดไป เพิ่มงานเหมือนกับที่คุณทำกับคำสั่ง at

การควบคุมการเข้าถึงคำสั่ง at

ไฟล์ at.allow และ at.deny จะควบคุมว่าใครสามารถใช้คำสั่ง at family ได้ สิ่งเหล่านี้อยู่ในไดเร็กทอรี /etc ตามค่าเริ่มต้น มีเพียงไฟล์ at.deny เท่านั้น และไฟล์จะถูกสร้างขึ้นเมื่อติดตั้งที่

นี่คือวิธีการทำงาน:

at.deny: แสดงรายการแอปพลิเคชันและเอนทิตีที่ไม่สามารถใช้เพื่อจัดกำหนดการงาน
at.allow: รายชื่อผู้ที่สามารถใช้ at เพื่อจัดกำหนดการงาน หากไม่มีไฟล์ at.allow ให้ใช้ไฟล์ at.deny เท่านั้น

โดยค่าเริ่มต้น ทุกคนสามารถใช้ที่ หากคุณต้องการจำกัดว่าใครสามารถใช้งานได้ ให้ใช้ไฟล์ at.allow เพื่อระบุรายชื่อผู้ที่สามารถใช้งานได้ ง่ายกว่าการเพิ่มทุกคนที่ไม่สามารถใช้ที่ไฟล์ at.deny

นี่คือลักษณะของไฟล์ at.deny:

sudo less /etc/at.deny

ดิ

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

ตอนนี้เราจะแก้ไขไฟล์ at.allow เราจะเพิ่มเดฟและแมรี่ แต่จะไม่มีใครได้รับอนุญาตให้ใช้

ขั้นแรก เราพิมพ์ดังต่อไปนี้:

sudo gedit /etc/at.allow

ดิ

ในตัวแก้ไข เราเพิ่มสองชื่อดังที่แสดงด้านล่าง แล้วบันทึกไฟล์

หากใครพยายามใช้เขาจะบอกว่าไม่ได้รับอนุญาต ตัวอย่างเช่น สมมติว่าผู้ใช้ชื่อ eric พิมพ์ดังต่อไปนี้:

at

เขาจะถูกปฏิเสธดังที่แสดงด้านล่าง

อีกครั้ง eric ไม่ได้อยู่ในไฟล์ at.deny ทันทีที่คุณใส่ใครก็ตามในไฟล์ at.allow, any- และทุกคนจะถูกปฏิเสธไม่ให้ใช้ at

เหมาะสำหรับใช้ครั้งเดียวจบ

อย่างที่คุณเห็น ทั้ง at และ batch นั้นเหมาะสำหรับงานที่คุณต้องเรียกใช้เพียงครั้งเดียว อีกครั้งในฐานะการตรวจสอบอย่างรวดเร็ว:

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

เรื่องล่าสุด

x