Category: Operating System

  • Check previous running script using process id

    วันนี้ในกลุ่ม sysadmin บน facebook คุยกันเรื่องของ ubuntu mirror ของ PSU แล้วมีประเด็นของการใช้ script สำหรับการ mirror

    ตัว script ที่ว่านี้ จะเป็น shell script ธรรมดา ที่จะไปเรียกใช้โปรแกรม rsync ที่จะทำหน้าที่ mirror ข้อมูลจาก primary ftp/rsync site ของ ubuntu มาเก็บไว้ที่เครื่อง server ของ PSU ตัว script จะถูกเรียกใช้โดย cron กำหนดไว้ใน crontab และเรียกใช้ 4-6 ครั้งใน 1 วัน (หรือ run ทุกๆ 6 หรือ 4 ชั่วโมง) ระยะเวลาที่ใช้ในการ run script ไม่แน่นอนว่าจะใช้เวลาเท่าไหร่ ขึ้นอยู่กับปริมาณของข้อมูลที่จะต้อง mirror จากต้นทางมายังปลายทาง

    ถึงแม้ว่าการใช้ rsync จะช่วยให้ transfer เฉพาะไฟล์ ที่มีการเปลี่ยนแปลงไป หลังจากการ mirror ครั้งสุดท้ายมา แต่ในบางครั้งจำนวนของข้อมูลที่เปลี่ยนแปลงไป ก็อาจจะมากกว่าปกติ เช่นในช่วงเวลาที่มีการเปลี่ยน release ซึ่งทำให้มีไฟล์ใหม่ๆ เพิ่มขึ้นเป็นจำนวนมาก ทำให้ จากช่วงปกติ ซึ่งอาจจะใช้เวลาเพียง 1-2 ชม. ในการ mirror และ mirror ทุกๆ 4 ชม. ก็เพียงพอ ในช่วงเวลาของการปรับเปลี่ยน release ถ้าจะ mirror ให้เสร็จ ก็อาจจะใช้เวลาถึง 12 ชม. เป็นต้น

    จะเกิดอะไรขึ้น ถ้าในการ mirror ครั้งที่แล้ว ยังไม่เสร็จสิ้นสมบูรณ์ แล้วก็ถึงเวลาของการ mirror รอบถัดไป?

    ถ้าไม่มีการตรวจสอบใดๆเลย กระบวนการของการ mirror ในครั้งถัดมาก็จะเริ่มทำงาน ในขณะที่รอบแรกยังไม่เสร็จ และ ถ้ามีข้อมูลที่ถูกเปลี่ยนแปลงมากจริงๆ ถึงรอบที่ 4-5 ของการ mirror แล้ว … การ mirror ครั้งแรกก็ยังไม่เสร็จเรียบร้อยดี … และพอถึงขั้นนี้แล้ว ระบบจะมีภาระงานสะสมมากขึ้นเรื่อยๆ และระบบเริ่มช้าลง และ จำนวน process ของการ mirror ที่คั้งค้างอยู่ก็จะเพิ่มขึ้นเรื่อยๆ เพราะ process หลังๆ ก็จะไปหน่วงการทำงานของ process แรกๆให้ทำงานช้าลงไปด้วย

    ครั้งแรกที่ผมเจอปัญหาในลักษณะนี้ process ของการ mirror ที่ run ค้างอยู่ทำให้ load ของระบบสูงกว่า 100 โชคยังดีที่ load ที่สูงขึ้นเกิดจาก i/o ของการเขียน disk ซึ่งยังทำให้สามารถ secure shell เข้าไปได้ สามารถ run คำสั่ง ps auxw เพื่อตรวจสอบได้ ถึงแม้จะช้าอยู่มาก แต่ก็ทำให้ทราบว่าปัญหาเกิดจากอะไร และเอาข้อมูลนั้นมาแก้ไขปัญหาในภายหลังได้

    สำหรับปัญหาแบบนี้ วิธีการแก้ไข ก็ไม่ได้ยากอะไร การทำงานของ mirror process ในครั้งหลังที่ถูก start ขึ้นมาด้วย cron ไม่ควรที่จะทำงานต่อ ถ้า process แรกที่ทำงานอยู่ ยังทำงานไม่เสร็จ ควรที่จะปล่อยให้ process แรกทำงานให้เสร็จเท่านั้นเอง

    ในแง่ของ shell script ก็สามารถทำได้ โดยการใช้ lock file ก่อนที่จะเริ่มต้นทำงาน ก็ตรวจสอบดูก่อนว่า มี lock file อยู่หรือเปล่า ถ้ามี ก็แสดงว่ายังมี process เดิมทำงานอยู่ ไม่ต้องทำอะไร ให้ terminate ไป ถ้าไม่มี lock file ก่อนที่จะเริ่มต้นทำงาน ก็สร้าง lock file ขึ้นมา เพื่อบอกว่า กำลังทำงานนี้อยู่ หลังจากทำงานเสร็จแล้ว ก็ลบ lock file นั้นทิ้ง เพื่อบอกว่า process ทำงานเสร็จแล้ว

    เขียนเป็น script คร่าวๆ ได้ประมาณนี้ครับ

    LOCK="/tmp/script-name.lock"
    if [ -f "$LOCK" ]; then
        # lock file exist
        echo "Previous process is still running..."
        exit  -1 # Terminate script here
    fi
    
    # No other process, we do our job as usual
    
    ...
    
    # end of our duty, do cleaning up, remove lock file
    
    rm -f $LOCK
    
    exit 0  # Terminate normally

    วิธีการนี้ เป็นวิธีการที่ใช้อยู่แล้ว สำหรับ mirror script ของ ubuntu แต่ล่าสุดนี้ มีปัญหาเกิดขึ้นก็คือ process ของการ mirror ที่ควรจะ run เป็นระยะๆ กลับหยุดทำงานไปหลายวัน

    ปัญหาที่เกิดขึ้นก็คือ script ที่ cron เรียกให้ทำงานนั้น ไม่ได้ทำงานเสร็จ ตามปกติของมัน ซึ่งจะมีการลบ lock file ทิ้งไป ซึ่ง สาเหตุอาจจะเกิดขึ้นได้จากหลายๆกรณี ในส่วนที่ผมเคยเจอ ก็คือ “ไฟดับ” ระบบที่ผมดูแลอยู่ในตอนนั้นถึงจะมี UPS backup แต่ไม่มีส่วนของการ monitor UPS และควบคุมให้ shutdown เครื่องแบบอัตโนมัติ ถ้าเกิดไฟดับนานเกินไป และ battery ของ UPS ไม่สามารถจ่ายไฟฟ้าให้นานพอจนกระทั่งไฟฟ้ากลับมาเป็นปกติได้ ตัว script ก็ตายไปกลางคัน พร้อมๆกับเครื่อง และ lock file นั้นก็ไม่ได้ถูกลบไป ทำให้ script ที่ run โดย cron ในรอบถัดไปไม่สามารถทำงานในส่วนของการ mirror ได้ เพราะ lock file ยังอยู่ (ตัว lock file ไม่ได้เก็บไว้ใน /tmp หรือ /var/lock) ส่วนกรณีอื่นๆ ก็จะเป็นกรณีที่ script เกิดตายไปกระทันหันโดยสาเหตุอื่นๆ เช่น out of memory หรือ process ถูก kill โดยกรณีอื่นๆ และ lock file ก็ถูกทิ้งค้างเอาไว้

    ตัว script ที่ผมใช้ในสมัยหลัง ก็เลยมีส่วนของการตรวจสอบเพิ่มขึ้นมาอีกอย่างหนึ่ง ก็คือ นอกจากจะ สร้าง lock file แล้ว ก็จะเก็บ process id ของ script เอาไว้ใน lock file นั้นด้วย ในการทำงานของ script ส่วนของการตรวจสอบว่า process ของ script ที่ทำงานอยู่ก่อนหน้านี้ ยังทำงานอยู่หรือเปล่า นอกจากตรวจสอบว่ามี lock file แล้ว ก็จะตรวจสอบว่า process ของ lock file นั้น ยังมีอยู่ในระบบหรือเปล่า

    ส่วนของการเก็บ process id ของ script นั้น ใช้วิธีการ

        echo "$$" > $LOCK

    ได้เลยตัว special shell variable ‘$$’ จะเป็นหมายเลข process id ของ shell ที่ใช้ในการ run script ตัวนั้น

    ส่วนการตรวจสอบว่า process นั้นยังทำงานอยู่หรือเปล่า ก็ใช้ process id ที่เก็บอยู่ใน lock file เอามาตรวจสอบ ซึ่งเราอาจจะตรวจสอบ โดยการใช้คำสั่ง

        ps ax | grep $previous_pid | grep -v grep

    ดูก็ได้ แต่จริงแล้ว ก็มีวิธีง่ายกว่านั้น ก็คือ สำหรับ Linux แล้ว จะมี virtual directory ที่ชื่อว่า /proc และ ทุกๆ process จะถูกสร้างเป็น sub directory ใน /proc โดยใช้ชื่อเป็นหมายเลขของ process id ดังนั้น แทนที่เราจะตรวจสอบโดยการใช้คำสั่ง ps ซึ่งจะต้องส่ง ourput ไปให้คำสั่ง grep อีก 2 รอบ ก็สามารถตรวจสอบเพียงแค่ว่ามี directory นั้นอยู่หรือเปล่าได้เลย โดยการใช้

        if [ -d /proc/$previous_pid ]; then
        ...
        fi

    ตัวอย่าง script ที่ใช้งานวิธีการนี้

    #!/bin/sh
    TASKNAME="this"
    LOCK="/tmp/${TASKNAME}.LCK"
    LOG="/tmp/${TASKNAME}.log"
    
    lock() {
        if [ -f $LOCK ]; then
           D=`date`
           task_pid=`cat $LOCK`
           if [ -d "/proc/$task_pid" ]; then
              # it's possible that this_pid is different task, but
              # it is very unlikely.
              echo "$D : Previous process (pid: $task_pid) is running"
              exit
           else
              # Lock is not clean up properly, assume
              echo "$D : clean up previous lock file (pid: $task_pid)"
           fi
        fi
        echo $$ > $LOCK
    }
    
    unlock() {
        rm -f $LOCK
    }
    
    do_myjob() {
        START=`date`
        sleep 10    # This is the real 'task' of this script
        STOP=`date`
        echo "Process start at: $START" >> $LOG
        echo "Process stop at : $STOP"  >> $LOG
    }
    
    lock
    do_myjob
    unlock

    ใน script ตัวอย่างข้างต้น สมมติ save ให้อยู่ในชื่อว่า t และกำหนด permission ให้สามารถ execute ได้ โดยใช้

    $ editor t
    $ chmod +x t

    เราสามารถ ตรวจสอบการทำงานของ script ดูได้ โดย ทดลอง run

    $ ./t

    ซึ่งมันจะรอเวลา 10 วินาที ตาม “sleep 10” ในฟังก์ชัน do_myjob() ก่อนที่จะกลับมาที่ shell prompt อีกครั้งนึง และในไฟล์ /tmp/this.log จะแสดง เวลาเริ่มต้นทำงาน และ ทำงานเสร็จ
    ถ้า run script ด้วยคำสั่ง

    $ ./t & ./t

    ตัว script ตัวแรกจะทำงานตามปกติ แต่ตัวที่สอง จะแสดงข้อความว่า “…Previous process (pid: xxxxx) is running” และ เราจะไม่สามารถ run script ครั้งที่สองได้ จนกว่า process ที่ run ค้างอยู่ทำงานเสร็จแล้ว และ ถ้าตรวจสอบใน log file ก็จะเห็นว่า การทำงานของ script จะเป็น [start, stop], [start, stop] ไปเรื่อยๆ ไม่มีการซ้อนเหลือมกัน

    แต่ใน script ตัวนี้ ถ้าหาไป comment บรรทัด lock; do_myjob; unlock เป็น

    # lock
    do_myjob
    # unlock

    แล้วทดลอง run script

    $  ./t & ./t

    ก็จะเห็นว่า script สามารถ run ซ้อนกันได้ และ ใน log file ก็จะเห็นเป็น star, stat, stop, stop ซ้อนเหลื่อมกัน ซึ่งเป็นกรณีที่เราไม่ต้องการให้เกิดขึ้น

    script ตัวนี้ อาจจะไม่ได้สมบูรณ์ 100% ในการใช้การตรวจสอบว่า มี process เดิมยังทำงานค้างอยู่หรือเปล่า เพราะมีความเห็นไปได้ว่า process id ที่มีอยู่และตรวจสอบจาก /proc ได้นั้น ไม่ได้เป็น process ของ script ตัวนี้ ที่ทำงานไปในครั้งที่แล้ว และยังทำงานไม่เสร็จ แต่เป็น process อื่นๆ ซึ่งไม่เกี่ยวข้องกับ script ตัวนี้เลยก็เป็นไปได้ เพราะ process id จะมีการเอากลับมาใช้ใหม่ หลังจากใช้ไปจนครบแล้ว แต่ โอกาสเช่นนั้น จะเกิดขึ้นได้น้อยมาก (process id เป็น process id เดียวกับ script ที่ terminate ไปแล้วแบบผิดปกติ และ process ที่ไม่เกี่ยวข้องทำงานอยู่ในช่วงเวลานี้พอดี) การตรวจสอบเพ่ิมเติม จะทำให้ script มีความซับซ้อนมากขึ้น โดยใช่เหตุ ก็เลยทิ้งไว้เท่านี้ครับ ผู้ที่สนใจ อาจจะตรวจสอบโดยใช้ ข้อมูลอื่นๆ ใน /proc/$process_id เช่น cmdline ดูได้ ทิ้งไว้ให้ไปลองทำเป็นการบ้านดูครับ 🙂

  • How to list linux file permissions in Octal Notation

    วันนี้เนื่องจากทีมผู้ดูแล  Web Hosting ต้องการดูว่ามีไฟล์ไหนบ้างที่มี permission เป็น 777 ก็เลยนั่งหาดูพบว่า สามารถใช้คำสั่ง stat ในการดูได้ เช่น

    $stat -c "%a %n" /var/www

    ผลลัพธ์
    Screenshot from 2013-05-01 11:47:06

    หรือ

    $stat -c "%A (%a) %8s %.19y %n" /var/www

    ผลลัพธ์
    Screenshot from 2013-05-01 11:49:19

    ทั้งนี้เนื่องจากไม่สามารถทำให้มัน recursive ได้ ก็ต้องหาไปทีละโฟลเดอร์ …. จนกระทั่งเจออีกคำสั่ง คือ สร้าง alias ชื่อ lso ดังนี้

    $alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"

    เมื่อจะใช้งาน ก็เพียงสั่ง lso ที่คอมมานด์ไลน์ ผลลัพธ์
    Screenshot from 2013-05-01 11:54:27

    สามารถปรับ option ของ ls ใน alias ให้ recursive ได้โดยเพิ่ม R ตัวใหญ่ลงไป ดังนี้

    $alias lso="ls -alGR | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"

    เมื่อเรียกใช้จะได้ผลลัพธ์
    Screenshot from 2013-05-01 11:57:21

    สามารถใช้ร่วมกับ grep เพื่อค้นหาเฉพาะค่าที่ต้องการ เช่น

    $lso|grep " ^777"

    ผลลัพธ์
    Screenshot from 2013-05-01 13:11:12

    ก็พอจะช่วยได้บ้างครับ Big Smile ขอให้สนุกครับ

    ที่มา

    http://thenubbyadmin.com/2012/02/16/how-to-list-linux-file-permissions-in-octal-notation/

    http://askubuntu.com/questions/152001/how-can-i-get-octal-file-permissions-from-command-line

  • แนวทางการ Backup บน Ubuntu Server (กรณีระบบ PSU EMail) #2

    ขยายความต่อจาก

    แนวทางการ Backup บน Ubuntu Server (กรณีระบบ PSU EMail)

    ลองมาดูทีละขั้นตอน

    1. ใน directory username.s มีไฟล์ดังนี้
    $ ls -l username.s
    total 0
    -rw-rw-r-- 1 mama mama 0 2013-04-29 14:31 a.txt
    -rw-rw-r-- 1 mama mama 0 2013-04-29 14:31 b.txt
    -rw-rw-r-- 1 mama mama 0 2013-04-29 14:31 c.txt
    -rw-rw-r-- 1 mama mama 0 2013-04-29 14:31 d.txt
    -rw-rw-r-- 1 mama mama 0 2013-04-29 14:31 e.txt

    2. ใช้คำสั่งต่อไปนี้ เพื่อทำการ Full Backup
    tar -zcf username.s-full.tar.gz -g username.s.snar username.s
    ดูไฟล์ใน username.s-full-tar.gz ด้วยคำสั่ง
    tar -ztf username.s-full.tar.gz -g username.s.snar username.s
    จะมีไฟล์ดังนี้
    username.s/
    username.s/a.txt
    username.s/b.txt
    username.s/c.txt
    username.s/d.txt
    username.s/e.txt

    3. ต่อมามีไฟล์เกิดใหม่ 2 ไฟล์ ชื่อ f.txt, g.txt
    4. เมื่อถึงเวลา ระบบทำการ Incremental Backup ด้วยคำสั่ง
    tar -zcf username.s-i01.tar.gz -g username.s.snar username.s
    ดูไฟล์ใน username.s-i01-tar.gz ด้วยคำสั่ง
    tar -ztf username.s-i01.tar.gz -g username.s.snar username.s
    จะมีไฟล์ดังนี้
    username.s/
    username.s/f.txt
    username.s/g.txt

    5. ลบไฟล์ c.txt, e.txt
    และมีไฟล์ h.txt เกิดขึ้น
    6. เมื่อถึงเวลา ระบบทำการ Incremental Backup ด้วยคำสั่ง
    tar -zcf username.s-i02.tar.gz -g username.s.snar username.s
    ดูไฟล์ใน username.s-i02-tar.gz ด้วยคำสั่ง
    tar -ztf username.s-i02.tar.gz -g username.s.snar username.s
    จะมีไฟล์ดังนี้
    username.s/
    username.s/h.txt

    7. (ในระบบ Email ไม่มีเหตุการณ์นี้ แต่ทำให้ดูเป็นตัวอย่าง) ถ้ามีการแก้ไขไฟล์ a.txt
    ซึ่งเดิมเป็นไฟล์ว่างๆ แต่ต่อมา มีการแก้ไขไฟล์ โดยเพิ่มคำว่า “hello world” เข้าไป
    echo "hello world" > username.s/a.txt
    8. เมื่อถึงเวลา ระบบทำการ Incremental Backup ด้วยคำสั่ง
    tar -zcf username.s-i03.tar.gz -g username.s.snar username.s
    ดูไฟล์ใน username.s-i03-tar.gz ด้วยคำสั่ง
    tar -ztf username.s-i03.tar.gz -g username.s.snar username.s
    จะมีไฟล์ดังนี้
    username.s/
    username.s/a.txt

    หวังว่าจะเป็นประโยชน์ครับ

  • How to create PSU VPN (L2TP/IPSec) connection Ubuntu 13.04?

    * ติดตั้งโปรแกรมชื่อ l2tp-ipsec-vpn ด้วยคำสั่ง

    $sudo apt-get install l2tp-ipsec-vpn

    ดังภาพ
    Screenshot from 2013-04-29 11:02:30
    * ตอบ y
    Screenshot from 2013-04-29 11:03:16
    * ตอบ No
    Screenshot from 2013-04-29 11:03:31
    Screenshot from 2013-04-29 11:03:40
    * กด OK
    Screenshot from 2013-04-29 11:03:53
    * สั่ง reboot เครื่อง
    Screenshot from 2013-04-29 11:04:12
    * เมื่อบูทเสร็จจะพบว่ามีไอคอนเพิ่มมาบนพาเนล
    Screenshot from 2013-04-29 11:44:16
    * คลิกซ้ายเลือก Edit Connection
    Screenshot from 2013-04-29 12:00:41
    * หน้าจอจะมืดลงและมีช่องให้ใส่พาสเวิร์ดของผู้ใช้ลงไปแล้วกด OK
    Screenshot from 2013-04-29 12:02:16
    * จะได้หน้าจอดังรูป
    Screenshot from 2013-04-29 11:21:03
    * คลิก Add จะได้หน้าจอดังรูป ใส่ vpn.psu.ac.th ลงไปในช่อง Connection name กด OK
    Screenshot from 2013-04-29 11:21:32
    * ได้ดังรูป
    Screenshot from 2013-04-29 12:06:09
    * คลิก Edit กรอกข้อความตามรูป
    Screenshot from 2013-04-29 11:22:00
    * คลิก PPP เลือกตามรูป ในช่อง Username และ Password ให้ใช้ PSU Passport
    Screenshot from 2013-04-29 11:22:30
    * คลิก IP setting คลิกเครื่องหมายถูกในช่องสี่เหลี่ยมหน้าข้อความ Obtain DNS server address automatically กด OK
    Screenshot from 2013-04-29 11:23:35
    * กด OK ออกมาจนสุดคลิก Close คลิก OK
    Screenshot from 2013-04-29 11:24:14
    * Reboot อีกครั้ง
    * คลิกที่ไอคอน เลือก vpn.psu.ac.th
    Screenshot from 2013-04-29 11:31:28
    Screenshot from 2013-04-29 11:25:37
    * เมื่อเชื่อมต่อสำเร็จจะเป็นดังรูป
    Screenshot from 2013-04-29 11:28:29
    * สำหรับ Linux Mint 15 อาจจะต้องทำคำสั่งนี้ก่อนจึงจะใช้งานได้

    sudo apt-add-repository ppa:werner-jaeger/ppa-werner-vpn
    sudo apt-get update && sudo apt-get install l2tp-ipsec-vpn

    * ขอให้สนุกครับ

    ที่มา http://rapidvpn.com/setup-vpn-l2tp-ubuntu.htm

  • Linux Mint – แหล่งรวมรวมเอกสาร ข้อมูลความรู้ต่างๆ

    Linux Mint – แหล่งรวมรวมเอกสาร ข้อมูลความรู้ต่างๆ
    ลิงค์ http://opensource.cc.psu.ac.th/Linuxmint

    1-วิธีตั้งค่าให้อัปเดต Linux Mint ได้เร็วขึ้น ทำได้โดยการตั้งค่าให้ติดต่อกับ server ในประเทศไทย
    ลิงค์ http://opensource.cc.psu.ac.th/วิธีตั้งค่าให้อัปเดต_Linux_Mint_ได้เร็วขึ้น

    2-วิธีปรับการตั้งค่า Linux Mint – Boot Options กรณีติดตั้ง Multi OS ปรับการหน่วงเวลาการเลือก OS
    ลิงค์ http://opensource.cc.psu.ac.th/วิธีปรับการตั้งค่า_Linux_Mint_-_Boot_Options_กรณีติดตั้ง_Multi_OS_ปรับการหน่วงเวลาการเลือก_OS

    3-คำสั่งตรวจสอบรายชื่อ packages ที่ติดตั้งในระบบปฎิบัติการ Linux Mint, Ubuntu, Debian
    ลิงค์ http://opensource.cc.psu.ac.th/คำสั่งตรวจสอบรายชื่อ_packages_ที่ติดตั้งในระบบปฎิบัติการ_Linux_Mint,_Ubuntu,_Debian

    4-แก้ไข Firefox browser แจ้งว่าใช้ flash player ที่ไม่ปลอดภัย หรือ Outdated
    ลิงค์ http://opensource.cc.psu.ac.th/แก้ไข Firefox browser แจ้งว่าใช้ flash player ที่ไม่ปลอดภัย

    5-ตั้งค่า VPN สำหรับ Linux Mint
    ลิงค์ http://opensource.cc.psu.ac.th/ตั้งค่า_VPN_สำหรับ_Linux_Mint

    และอื่นๆที่จะมีเพิ่มเติมมาเรื่อยๆ

  • ตัวอย่างการใช้งาน mutt เพื่อส่ง email แบบ command line

    เมื่อต้องการส่ง email ด้วย command line วิธีที่ถูกต้องที่สุด ไม่ผูกติดกับ email client program บน Linux คือการสร้างไฟล์ แล้วส่งผ่าน sendmail ไม่ว่าจะเป็น original sendmail หรือ backward-compatibility ของ postfix ก็ตาม (จะกล่าวในอีกบทความหนึ่ง)

    แต่หากต้องการความง่าย ก็ลองใช้วิธีนี้ดูครับ

    ผ่านโปรแกรมชื่อ mutt

    ตัวอย่างคือ

    1. ส่ง email ไปให้ username.s@xxx.psu.ac.th

    2. บอกว่า ส่งจาก IT Department ซึ่ง email address เป็น blah@itdept.xxx.psu.ac.th

    3. มี Subject ว่า This is Subject

    4. แนบไฟล์ชื่อ test.txt

    5. แต่จดหมายนี้ ไม่ต้องการให้ผู้ใช้ตอบกลับ จึงส่งให้ no-reply@xxx.psu.ac.th เพื่อโยนทิ้งทันที

    6. เนื้อความ ว่า Hello World

     

    สามารถใช้คำสั่งต่อไปนี้

    export REPLYTO="no-reply@xxx.psu.ac.th"; export EMAIL="IT Department <blah@itdept.xxx.psu.ac.th>"; echo "Hello World" | mutt -s "This is Subject" -a test.txt -- kanakorn.h@psu.ac.th

  • บันทึกการสร้าง LVM Partition

    เนื่องจากมี disk ขนาดแค่ 560 GB หลายลูก แต่ต้องการเอามารวมกันให้เป็น Volume ใหญ่ๆ และไม่ใช้ RAID
    เขียนเป็นบันทึกเก็บไว้ จึงอยากเอามานำเสนอ เผื่อเป็นประโยชน์

    1. มี /dev/sdb , /dev/sdc , /dev/sdd ก้อนละ 560 GB อยู่ ต้องทำ LVM

    เป้าหมายคือ ต้องการได้ Device สำหรับการ mount ชื่อ /dev/virtual1/logical1

    reference:
    http://www.howtoforge.com/linux_lvm
    http://www.linuxquestions.org/questions/linux-hardware-18/lvcreate-with-max-size-available-749253/
    2. ติดตั้ง lvm software ด้วยคำสั่ง

    apt-get install lvm2 dmsetup mdadm reiserfsprogs xfsprogs

    3. สร้าง partition ใน physical disk ให้เป็นของ LVM Partition

    sudo su
    fdisk /dev/sdb
    Command (m for help): n
    Partition type: p
    Partition number (1-4, default 1): 1
    First sector (2048-1073741823, default 2048):
    Last sector, +sectors or +size{K,M,G} (2048-1073741823, default 1073741823):
    Command (m for help): t
    Hex code (type L to list codes): 8e
    Command (m for help): w

    ทำเช่นเดียวกับกับทั้ง /dev/sdc, /dev/sdd

    4. ต่อไป สร้าง Physical Volume ของ LVM
    pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1
    pvdisplay

    5. ต่อไป สร้าง Group Volume ของ LVM
    vgcreate virtual1 /dev/sdb1 /dev/sdc1 /dev/sdd1
    vgdisplay
    vgscan

    6. ต่อไป สร้าง Logical Volume ของ LVM (เต็มพื้นที่ที่มี)
    lvcreate --name logical1 -l 100%Free virtual1
    lvdisplay
    lvscan

    7. ต่อไป สร้าง Filesystem แบบ ext4
    mkfs.ext4 /dev/virtual1/logical1

    8. แก้ fstab แล้ว mount
    vi /etc/fstab
    /dev/virtual1/logical1 /var/spool/mailbackup ext4 rw,noatime 0 0
    mount -a

  • elvisnox: text is invisible in black background xterm

    *Ubuntu 13.04 แก้ปัญหานี้แล้วครับ

    หลังจากเข้าร่วม ติว “VirtualBox Networking + vi + Shell Scripts” ก็ติดใจใช้แต่ elvis (elvis เป็น vi editor ชนิดหนึ่ง http://fivedots.coe.psu.ac.th/~cj/LUG/vi.pdf สามารถติดตั้งเพิ่มโดยใช้คำสั่ง

    $sudo apt-get install elvis

    ซึ่งเมื่อติดตั้งแล้ว elvis จะกลายเป็น default editor ทันที ดูได้จากคำสั่ง

    $sudo update-alternative --config editor

    ดังรูป
    Selection_003 )

    มาโดยตลอด ติดอยู่อย่างเดียวคือ เมื่อติดตั้งแล้ว เมื่อเปิด vi ขึ้นมาพบว่าหน้าจอเป็นสีดำทั้งหมด Angry
    Screenshot from 2013-04-17 13:37:57

    ก็ต้องมาเปลี่ยนสีของ terminal เพื่อให้อ่านออกเป็นแบบนี้

    Screenshot from 2013-04-17 13:46:52

    อีกวิธีไม่ต้องแก้สีของโปรไฟล์ คือ แก้ค่าในแฟ้ม /etc/elvis/elvis.clr

    $sudo vi /etc/elvis/elvis.clr

    ให้มองหาข้อความ case termcap { แล้วแก้ตรงบรรทัดที่เขียนว่า color normal yellow or black เป็น color normal yellow on black เซฟแล้วลองเรียก vi ใหม่ได้ผลดังนี้

    Screenshot from 2013-04-17 13:49:40

    สงสัยจะใส่ค่า config ผิดตั้งแต่ตัวติดตั้ง What?! ขอให้สนุกครับ

    ที่มา http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=474202