Linux
น้องๆ เคยไหม? ต้องมานั่งทำอะไรซ้ำๆ เดิมๆ บน Linux Server ทุกวัน เช่น ลบ Log File เก่าๆ, Backup Database หรือ Restart Service ตอนตี 3... ชีวิตมันน่าเบื่อใช่ไหมล่ะ? นั่นแหละคือที่มาของ Automation หรือการทำให้งานพวกนี้มัน "อัตโนมัติ" โดยไม่ต้องให้เรามานั่งเฝ้า
Bash Scripting ก็คือการเขียนโปรแกรมง่ายๆ ด้วยภาษา Bash (Bourne Again SHell) เพื่อสั่งให้ Linux ทำงานตามที่เราต้องการแบบอัตโนมัติไงล่ะ สมัยผมทำร้านเน็ต SiamCafe.net เมื่อก่อนเนี่ย ต้องคอย Restart Server เองทุกวัน กว่าจะหาทางทำ Script ได้ก็แทบแย่ แต่พอทำได้แล้วชีวิตดีขึ้นเยอะเลย
ทำไมมันถึงสำคัญ? ง่ายๆ เลยนะ:
ก่อนจะไปเขียน Script จริงๆ เราต้องมีพื้นฐานกันก่อนนะ ไม่ต้องกลัว ยากกว่า HTML นิดเดียวเอง!
น้องๆ ต้องคุ้นเคยกับ Command Line ของ Linux ก่อนนะ พวกคำสั่งพื้นฐานอย่าง ls, cd, mkdir, rm อะไรพวกนี้ ถ้ายังไม่คล่อง ลองไปฝึกใช้ดูก่อนนะ สำคัญมากๆ
# แสดงไฟล์และโฟลเดอร์ในปัจจุบัน
ls -l
# เปลี่ยนไปยังโฟลเดอร์ Documents
cd Documents
# สร้างโฟลเดอร์ใหม่ชื่อ "MyScript"
mkdir MyScript
# ลบไฟล์ชื่อ "test.txt"
rm test.txt
สมัยผมทำร้านเน็ต Command Line นี่คือชีวิตประจำวันเลย แก้ปัญหาทุกอย่างผ่าน Command Line
ตัวแปรใน Bash ก็เหมือนกล่องเก็บข้อมูลชั่วคราวนั่นแหละ เราสามารถเอาข้อมูลใส่เข้าไป แล้วเรียกใช้ทีหลังได้
# กำหนดค่าให้ตัวแปร NAME
NAME="Kittitouch"
# แสดงค่าของตัวแปร NAME
echo "Hello, $NAME!"
จำไว้ว่าเวลาเรียกใช้ตัวแปร ต้องใส่ $ นำหน้านะ
มาถึงขั้นตอนการเขียน Script จริงๆ แล้วนะ ใจเย็นๆ ค่อยๆ ทำตาม เดี๋ยวก็เก่ง
1. สร้างไฟล์ Script: สร้างไฟล์ใหม่ด้วย Text Editor อะไรก็ได้ (เช่น Nano, Vim) แล้วตั้งชื่อให้สื่อความหมาย เช่น backup_database.sh
nano backup_database.sh
2. ใส่ Shebang: บรรทัดแรกของ Script ต้องมี #!/bin/bash เสมอ มันคือการบอก Linux ว่าให้ใช้ Bash ในการรัน Script นี้
#!/bin/bash
3. เขียน Code: เขียนคำสั่ง Bash ที่เราต้องการให้ทำงานลงไปในไฟล์
4. ให้สิทธิ์ Execute: สั่งให้ไฟล์ Script สามารถรันได้
chmod +x backup_database.sh
5. รัน Script: รัน Script โดยใช้ ./ นำหน้าชื่อไฟล์
./backup_database.sh
สมมติว่าเราต้องการ Backup Database MySQL ทุกวันตอนตี 3 นี่คือ Script ง่ายๆ:
#!/bin/bash
# Database Credentials
DB_USER="your_username"
DB_PASS="your_password"
DB_NAME="your_database"
# Backup Directory
BACKUP_DIR="/var/backups/mysql"
# Create Backup Directory if it doesn't exist
mkdir -p $BACKUP_DIR
# Filename for Backup
DATE=$(date +%Y-%m-%d)
BACKUP_FILE="$BACKUP_DIR/$DB_NAME-$DATE.sql.gz"
# Backup Database
mysqldump -u $DB_USER -p"$DB_PASS" $DB_NAME | gzip > $BACKUP_FILE
# Log the Backup
echo "Database backup created: $BACKUP_FILE" >> /var/log/backup.log
อย่าลืมเปลี่ยน DB_USER, DB_PASS, DB_NAME และ BACKUP_DIR ให้ตรงกับของตัวเองนะ
Log File เนี่ย พอใช้ไปนานๆ มันจะใหญ่ขึ้นเรื่อยๆ กินพื้นที่ Server เรา ถ้าไม่จัดการมันจะเต็มเอาได้ เราสามารถใช้ Script ช่วย Rotate Log File ได้
#!/bin/bash
# Log File to Rotate
LOG_FILE="/var/log/application.log"
# Number of Backups to Keep
BACKUP_COUNT=7
# Rotate Log File
DATE=$(date +%Y-%m-%d)
mv $LOG_FILE $LOG_FILE.$DATE
gzip $LOG_FILE.$DATE
# Remove Old Backups
find /var/log -name "application.log.*.gz" -type f -mtime +$BACKUP_COUNT -delete
# Create New Log File
touch $LOG_FILE
Script นี้จะ Rotate Log File ทุกวัน เก็บ Backup ไว้ 7 วัน แล้วลบ Backup เก่าๆ ออก
อยากอ่านเรื่องราว IT สนุกๆ เพิ่มเติม? ลองแวะไปที่ SiamCafe Blog ดูนะ
ดูวิดีโอเพิ่มเติมเกี่ยวกับBash Scripting Automation:
Bash Scripting ไม่ใช่ทางเลือกเดียวในการทำ Automation นะ ยังมีเครื่องมืออื่นๆ อีกมากมาย แต่ละอย่างก็มีข้อดีข้อเสียต่างกัน
Cron: เป็น Scheduler ที่ใช้รัน Script ตามเวลาที่กำหนด Cron เหมาะกับงานที่ต้องทำเป็นประจำ เช่น Backup, Log Rotation
Ansible: เป็น Automation Tool ที่ซับซ้อนกว่า ใช้สำหรับจัดการ Server หลายๆ เครื่องพร้อมกัน เหมาะกับองค์กรใหญ่ๆ ที่มี Server เยอะๆ
Python: เป็นภาษา Programming ที่นิยมใช้ในการทำ Automation มี Library ให้ใช้เยอะแยะ เหมาะกับงานที่ซับซ้อนกว่า Bash Scripting
| เครื่องมือ | ข้อดี | ข้อเสีย | เหมาะกับ |
|---|---|---|---|
| Bash Scripting | ง่าย, เรียนรู้ง่าย, ติดตั้งมาพร้อม Linux | ไม่เหมาะกับงานที่ซับซ้อน, Debug ยาก | งานง่ายๆ, งานที่ต้องทำบน Linux โดยตรง |
| Cron | ใช้งานง่าย, ตั้งเวลาได้ละเอียด | ไม่เหมาะกับงานที่ต้องทำตาม Event | งานที่ต้องทำเป็นประจำ |
| Ansible | จัดการ Server จำนวนมากได้, Config เป็น Code | ซับซ้อน, ต้องเรียนรู้ | องค์กรใหญ่ๆ, Server จำนวนมาก |
| Python | ยืดหยุ่น, มี Library เยอะแยะ | ต้องติดตั้ง Python, Code ยาวกว่า Bash | งานที่ซับซ้อน, งานที่ต้องการ Library พิเศษ |
เลือกเครื่องมือที่เหมาะกับงานของเรานะ ไม่มีอะไรดีที่สุดเสมอไป
ถ้าอยากรู้เรื่อง Linux เพิ่มเติม แวะมาคุยกันได้ที่ SiamCafe Blog นะครับ
เอาล่ะน้องๆ มาถึงตรงนี้แล้ว เรามาคุยกันเรื่อง "ของจริง" กันบ้างดีกว่า สมัยผมทำร้านเน็ต SiamCafe นี่แหละ เจอปัญหาหน้างานเยอะแยะ จนต้องพัฒนากลเม็ดเคล็ดลับต่างๆ มาใช้กับ Bash Script นี่แหละ
จำไว้เลยว่า Script ที่ดี ต้อง "อ่านง่าย เข้าใจง่าย แก้ไขง่าย" เพราะวันนึงที่เราไม่อยู่ หรือต้องส่งต่อให้คนอื่นดูแล เค้าจะได้ไม่ด่าเราลับหลัง (ฮา)
3 เทคนิคที่ผมใช้บ่อยๆ แล้วได้ผลดี ลองเอาไปปรับใช้กันดูนะ
เขียน Script เหมือนเขียนจดหมายถึงตัวเองในอนาคต หรือเพื่อนร่วมงาน Comment อธิบายว่าแต่ละส่วนของ Script ทำอะไร ทำไมต้องทำแบบนี้
# Check if a process is running
process_name="nginx"
if pgrep $process_name > /dev/null
then
echo "$process_name is running"
else
echo "$process_name is not running"
fi
ดู Code ด้านบนสิ เห็นไหมว่า Comment ช่วยให้เราเข้าใจได้ทันทีว่า Script นี้ทำอะไร
อย่าเขียน Script ยาวเป็นพรืด ให้แบ่งงานออกเป็น Functions เล็กๆ แต่ละ Function ทำงานเฉพาะอย่าง แล้วเรียกใช้ Function เหล่านั้นตามต้องการ เหมือนต่อ Lego นั่นแหละ
#!/bin/bash
# Function to check disk space
check_disk_space() {
disk_usage=$(df -h / | awk 'NR==2{print $5}' | tr -d '%')
if (( $disk_usage > 80 )); then
echo "Warning: Disk space usage is over 80%"
else
echo "Disk space usage is OK"
fi
}
# Main script
echo "Checking disk space..."
check_disk_space
Function check_disk_space() ทำหน้าที่ตรวจสอบพื้นที่ Disk แล้วแสดงผลลัพธ์ Script หลักแค่เรียกใช้ Function นี้ จบ!
Script ที่ดีต้อง "จัดการกับ Error ได้" ไม่ใช่เจอ Error แล้ว "พัง" เลย ลองนึกภาพว่า Script ของเราไปรันบน Server ที่ไม่มีใครดูแล ถ้าเจอ Error แล้วหยุดทำงาน Server ก็อาจจะ Down ได้
#!/bin/bash
# Try to create a directory
mkdir /tmp/new_directory
# Check if the directory was created successfully
if [ $? -eq 0 ]; then
echo "Directory created successfully"
else
echo "Error creating directory"
exit 1 # Exit with an error code
fi
$? คือ ตัวแปรที่เก็บ Error Code จาก Command ก่อนหน้า ถ้าเป็น 0 แสดงว่า Command ทำงานสำเร็จ ถ้าไม่เป็น 0 แสดงว่ามี Error
ใช้ naming convention (การตั้งชื่อ) ที่สอดคล้องกันตลอดทั้ง Script เช่น ถ้าตั้งชื่อตัวแปรเป็น user_name ก็ควรใช้ user_name ตลอดไป อย่าเปลี่ยนเป็น username หรือ userName เพราะจะทำให้งง
Code ที่สอดคล้องกันจะทำให้คนอื่น (รวมถึงตัวเราเองในอนาคต) อ่านเข้าใจง่ายขึ้นเยอะเลย
A: Bash Script เหมาะสำหรับงาน Automation เล็กๆ น้อยๆ ที่ไม่ต้องใช้ Performance สูงๆ เขียนง่าย รันได้เลย ไม่ต้อง Compile แถมมี Command Line Tools ให้ใช้เยอะแยะ สมัยผมดูแลร้านเน็ต แค่ Bash Script ก็เอาอยู่แล้ว
A: ถ้า Script เริ่มซับซ้อนมากๆ อาจจะถึงเวลาที่ต้องเปลี่ยนไปใช้ภาษา Programming อื่น เช่น Python หรือ Go เพราะมีความสามารถในการจัดการกับ Code ที่ซับซ้อนได้ดีกว่า
A: มีเยอะแยะเลยน้อง เช่น ShellCheck (ช่วยตรวจสอบ Syntax Error) หรือ shfmt (ช่วย Format Code ให้สวยงาม)
Bash Script เป็นเครื่องมือที่ทรงพลังมาก ถ้าเราใช้มันอย่างถูกต้อง มันจะช่วยให้เราทำงานได้เร็วขึ้น ง่ายขึ้น และสนุกขึ้นเยอะเลย อย่ากลัวที่จะลองผิดลองถูก เพราะประสบการณ์คือครูที่ดีที่สุด
อย่าลืมแวะไปดู iCafeForex นะ เผื่อใครสนใจเรื่องลงทุน (ฮา) และก็เข้าไปอ่านบทความอื่นๆ ได้ที่ SiamCafe Blog นะครับ