At Command — One-time Scheduled Tasks บน Linux

Cron Jobs เหมาะสำหรับงานที่ต้องรันซ้ำตามกำหนดเวลา แต่บางครั้งต้องการรันคำสั่งครั้งเดียวในอนาคตโดยไม่ต้องตั้ง Cron ถาวร เช่น รีสตาร์ท Service หลังเที่ยงคืน หรือส่งไฟล์ตอนตี 3 ในกรณีนี้ at command เป็นเครื่องมือที่เหมาะกว่า Cron

บทความนี้อธิบายการใช้ at command สำหรับ One-time Scheduled Tasks บน Linux ตั้งแต่การติดตั้ง ไวยากรณ์การระบุเวลา การดูและยกเลิก Job รวมถึงคำสั่ง batch สำหรับ Job ที่รอ System Load ต่ำ

ติดตั้ง at

# Ubuntu/Debian
sudo apt install at

# RHEL/CentOS/Rocky Linux
sudo dnf install at

# เปิดใช้งาน atd service (daemon ที่รัน at jobs)
sudo systemctl enable --now atd

# ตรวจสอบว่า atd รันอยู่
systemctl status atd

ไวยากรณ์พื้นฐาน

คำสั่ง at รับเวลาเป็น Argument แล้วรอรับคำสั่งจาก Standard Input จนกว่าจะกด Ctrl+D เพื่อบันทึก Job

# รูปแบบทั่วไป
at [TIME]

# ตัวอย่าง — รันตอน 23:00 คืนนี้
at 23:00
at> /usr/local/bin/backup.sh
at> <EOT>   # กด Ctrl+D เพื่อบันทึก

# ป้อนคำสั่งผ่าน echo pipe (ไม่ต้อง interactive)
echo "/usr/local/bin/backup.sh" | at 23:00

# ใช้ heredoc สำหรับหลายคำสั่ง
at 02:00 <<'EOF'
/usr/local/bin/backup-db.sh
/usr/local/bin/backup-files.sh
echo "Backup done" | mail -s "Backup Complete" [email protected]
EOF

รูปแบบการระบุเวลา

at รองรับการระบุเวลาได้หลายรูปแบบ ทั้งเวลาที่แน่นอน เวลาสัมพัทธ์ และคำอธิบายแบบข้อความ

# เวลาที่แน่นอน
at 14:30               # บ่ายสองครึ่งวันนี้
at 2:30pm              # เหมือนกัน (รูปแบบ 12 ชั่วโมง)
at 14:30 tomorrow      # พรุ่งนี้บ่ายสองครึ่ง
at 14:30 next monday   # วันจันทร์หน้า
at 14:30 2026-05-01    # วันที่กำหนด (YYYY-MM-DD)
at noon                # เที่ยงวัน
at midnight            # เที่ยงคืน
at teatime             # 16:00 (4pm)

# เวลาสัมพัทธ์ (นับจากตอนนี้)
at now + 30 minutes    # 30 นาทีจากนี้
at now + 2 hours       # 2 ชั่วโมงจากนี้
at now + 3 days        # 3 วันจากนี้
at now + 1 week        # 1 สัปดาห์จากนี้

ดูรายการ Job ที่รอรัน

# ดูรายการ at jobs ทั้งหมด
atq

# หรือใช้ at -l (เหมือนกัน)
at -l

# ตัวอย่าง output ของ atq
# 3   Thu Apr 17 02:00:00 2026 a root
# 4   Fri Apr 18 14:30:00 2026 a deploy
# (หมายเลข Job, เวลารัน, queue, user)

ดูรายละเอียดและยกเลิก Job

# ดูคำสั่งใน Job (ต้องเป็น root หรือเจ้าของ Job)
at -c 3           # ดู Job หมายเลข 3

# ยกเลิก Job
atrm 3            # ยกเลิก Job หมายเลข 3
at -d 3           # เหมือนกัน (alternative syntax)

# ยกเลิกหลาย Job พร้อมกัน
atrm 3 4 5

ใช้ไฟล์ Script กับ at

วิธีที่แนะนำสำหรับ Job ที่มีหลายคำสั่งคือเขียนเป็น Shell Script แล้วสั่ง at ให้รัน Script นั้น

# รัน Script ตอนตี 3 พรุ่งนี้
echo "/usr/local/bin/maintenance.sh" | at 03:00 tomorrow

# รัน Script พร้อม Logging
echo "/usr/local/bin/deploy.sh >> /var/log/deploy.log 2>&1" | at 01:00

# ระบุ Shell ใน Script เพื่อป้องกัน Environment ต่างกัน
#!/bin/bash
# /usr/local/bin/maintenance.sh
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
/usr/local/bin/backup-db.sh
systemctl restart myapp

batch command — รันเมื่อ Load ต่ำ

batch คล้าย at แต่จะรอจนกว่า System Load เฉลี่ย (Load Average) จะต่ำกว่า 1.5 ก่อนค่อยรันคำสั่ง เหมาะสำหรับงานที่ใช้ทรัพยากรสูงและไม่ต้องรันตรงเวลาพอดี

# รันเมื่อ System Load ต่ำ (ไม่ระบุเวลา)
echo "/usr/local/bin/heavy-task.sh" | batch

# batch ใช้ queue 'b' แทน queue 'a' ของ at
# ดู batch jobs ด้วย atq เหมือนกัน
atq

ควบคุมสิทธิ์การใช้ at

Linux ควบคุมว่า User ใดสามารถใช้ at ได้ผ่านไฟล์ /etc/at.allow และ /etc/at.deny

# /etc/at.allow — ถ้าไฟล์นี้มีอยู่ เฉพาะ User ที่ระบุเท่านั้นที่ใช้ at ได้
# /etc/at.deny  — User ที่ระบุในไฟล์นี้จะถูกบล็อกจาก at

# กฎการตัดสินใจ:
# 1. ถ้า at.allow มีอยู่ → เฉพาะ User ใน at.allow เท่านั้น
# 2. ถ้า at.allow ไม่มี แต่ at.deny มี → ทุกคนยกเว้น User ใน at.deny
# 3. ถ้าไม่มีไฟล์ใดเลย → เฉพาะ root เท่านั้น

# ดูว่า User ปัจจุบันใช้ at ได้ไหม
at -l 2>&1 | head -1

ตัวอย่างการใช้งานจริง

# ตัวอย่างที่ 1 — ส่งไฟล์ Report ตอนตี 3 คืนนี้
echo "mail -s 'Monthly Report' [email protected] < /tmp/report.txt" | at 03:00

# ตัวอย่างที่ 2 — Restart Service หลัง Maintenance Window
echo "systemctl restart nginx" | at now + 2 hours

# ตัวอย่างที่ 3 — ทำ Deployment ตอนเช้า
at 06:00 tomorrow <<'EOF'
cd /opt/myapp
git pull origin main
systemctl restart myapp
echo "Deployment done at $(date)" >> /var/log/deploy.log
EOF

# ตัวอย่างที่ 4 — ลบไฟล์ Temp หลัง 1 ชั่วโมง
echo "rm -f /tmp/large-export-*.csv" | at now + 1 hour

# ตัวอย่างที่ 5 — แจ้งเตือนก่อน Certificate หมดอายุ
echo "echo 'SSL cert expires in 7 days' | mail -s '[Alert] SSL Expiry' [email protected]" | at 09:00 next monday

Environment ของ at

เช่นเดียวกับ Cron, at รันในสภาพแวดล้อมที่แตกต่างจาก Interactive Shell ข้อดีคือ at จะ copy Environment ณ เวลาที่สั่ง Job ไว้ด้วย ทำให้ได้ PATH เดียวกันกับตอนที่พิมพ์คำสั่ง อย่างไรก็ตาม การใช้ Full Path ยังเป็น Best Practice

# ตรวจสอบ Environment ที่ at จะใช้
at now + 1 minute <<'EOF'
env > /tmp/at-env.txt
EOF

# ดูผลหลัง 1 นาที
cat /tmp/at-env.txt

เปรียบเทียบ at กับ Cron

# at  — รันครั้งเดียวในอนาคต
echo "backup.sh" | at 02:00 tomorrow

# Cron — รันซ้ำตามกำหนดการ (ต้องแก้ crontab -e)
# 0 2 * * * /usr/local/bin/backup.sh

# เมื่อใช้ at:
# - งานที่รันครั้งเดียว เช่น Deployment, Maintenance, Cleanup
# - ไม่ต้องการแก้ Crontab ถาวร
# - ต้องการความยืดหยุ่นในการระบุเวลาแบบ Relative

# เมื่อใช้ Cron:
# - งานที่ทำซ้ำทุกวัน/ชั่วโมง/สัปดาห์
# - Backup, Log Rotation, Report Generation
# - Health Check

สรุป

at command เป็นเครื่องมือสำหรับ One-time Scheduled Tasks ที่ต้องรันในอนาคต รองรับการระบุเวลาได้หลายรูปแบบทั้งเวลาแน่นอน เวลาสัมพัทธ์ และ Keyword เช่น midnight, noon, tomorrow atq ใช้ดูรายการ Job ที่รอรัน และ atrm ใช้ยกเลิก Job batch เป็นตัวเลือกเมื่อต้องการรองานที่ใช้ทรัพยากรสูงจนกว่า System Load จะต่ำลง สำหรับงานที่ต้องรันซ้ำตาม Schedule ให้ใช้ Cron แทน

แนะนำบริการ DE

การใช้ at command สำหรับ Scheduled Maintenance และ Deployment Tasks จำเป็นต้องมีสิทธิ์เข้าถึง Server โดยตรง Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบเหมาะสำหรับการตั้งค่า Automation และ Scheduled Tasks บน Server จริง

หากต้องการโฮสต์เว็บไซต์โดยมีระบบ Scheduled Tasks จัดการให้อัตโนมัติผ่าน Control Panel Cloud Hosting ของ DE รองรับ Cron Job ผ่านหน้า Panel ที่ใช้งานง่าย