Month: May 2013

  • How to install apache,php,mysql instead xampp on ubuntu (for newbie)

    แรกเริ่มเดินทีวันนี้ก็ไม่ได้จะเขียน Post นี้หรอกครับ เพียงแต่ว่ามี บุคลากรในที่ทำงานเจอปัญหาในการติดตั้งโปรแกรม ห้องสมุด ULIB  โดยใช้ Ubuntu 12.04.1 LTS  เป็น server แล้วติดตั้ง xampp เพื่อให้ได้ครบทุก package ในการใช้งาน แต่ไม่สามารถทำการติดตั้งโปรแกรม ULIB ได้เนื่องจากโปรแกรมฟ้องเรื่อง permission  ในการติดตั้งโปรแกรมดังข้างล่าง

     

    มีปัญหาเกี่ยวกับการเปลี่ยนโหมดไฟล์/File permission problem – ไม่อนุญาตให้ติดตั้ง [../inc/config.inc.sv.php]
    Notice: Undefined variable: dcrs in /opt/lampp/htdocs/ULIB/install/index.php on line 239
    มีปัญหาเกี่ยวกับการเปลี่ยนโหมดไฟล์/File permission problem – ไม่อนุญาตให้ติดตั้ง [../inc/config.inc.php]
    Notice: Undefined variable: dcrs in /opt/lampp/htdocs/ULIB/install/index.php on line 239
    มีปัญหาเกี่ยวกับการเปลี่ยนโหมดไฟล์/File permission problem – ไม่อนุญาตให้ติดตั้ง [../inc/c.inc.php]
    Notice: Undefined variable: dcrs in /opt/lampp/htdocs/ULIB/install/index.php on line 239
    มีปัญหาเกี่ยวกับการเปลี่ยนโหมดไฟล์/File permission problem – ไม่อนุญาตให้ติดตั้ง [../webboard/c.inc.php]
    Notice: Undefined variable: dcrs in /opt/lampp/htdocs/ULIB/install/index.php on line 239
    มีปัญหาเกี่ยวกับการเปลี่ยนโหมดไฟล์/File permission problem – ไม่อนุญาตให้ติดตั้ง [../web/c.inc.php]
    Notice: Undefined variable: dcrs in /opt/lampp/htdocs/ULIB/install/index.php on line 239

    หากคุณเป็นผู้ดูแลระบบเซิร์ฟเวอร์บนระบบปฏิบัติการ Linux/If you are server administrator (Linux)
    Execute in command line
    chown apache:apache ‘/opt/lampp/htdocs/ULIB/inc/config.inc.sv.php’ ;
    chown apache:apache ‘/opt/lampp/htdocs/ULIB/inc/config.inc.php’ ;
    chown apache:apache ‘/opt/lampp/htdocs/ULIB/inc/c.inc.php’ ;
    chown apache:apache ‘/opt/lampp/htdocs/ULIB/webboard/c.inc.php’ ;
    chown apache:apache ‘/opt/lampp/htdocs/ULIB/web/c.inc.php’ ;

    * apache:apache คือชื่อ User และ Group ของโปรแกรม Apache หากเซิร์ฟเวอร์ของคุณมีการปรับแต่งเป็นอย่างอื่น ก็ต้องแก้ apache:apache ตามด้วย

     

    ผมจึงลองเปลี่ยน user และ group เป็น www-data:www-data  แล้วแต่มันก็ยังไม่สามารถติดตั้งระบบได้อยู่ดี จึงลองลบ xampp ออกจากเครื่องเลย วิธีการลบตอนแรกก็งงๆเหมือนกัน เพราะผมดันไปใช้คำสั่ง apt-get install opt  และก็ dpkg -P opt  ซึ่งมันก็ไม่สามารถลบได้ เพราะเหมือนว่าไอ่เจ้าถูก opt มองเห็นเป็นเพียง directory หนึ่งเท่านั้น ดังนั้นวิธีการลบจึงแค่ใช้คำสั่ง rm -rf /opt แทน ครับ [1]

    จากนั้นเมื่อลบแล้วจึงลองติดตั้งแบบแยกทีบะตัวดูครับโดยเริ่มจาก

    1.ติดตั้ง MySQL  ก่อนเป็นอันดับแรกเลยก็ได้ครับโดยใช้คำสั่ง   sudo  apt-get install mysql-server mysql-client   ระบบจะให้เราใส่รหัสผ่านของ root และก็ยืนยันอีกครั้ง [2]

    2.ติดตั้ง apache2  โดยใช้คำสั่ง    sudo    apt-get install apache2 apache2-doc      [3]

    3.ติดตั้ง php  โดยคำสั่ง                  sudo  apt-get install php5 libapache2-mod-php5    โดยตอนที่ระบบมันถามว่าจะเลือก server อะไรให้เราเลือก apache2  นะครับ  [4]

    4.ทำการ restart service ด้วยคำสั่ง   sudo /etc/init.d/apache2  restart    (จากนี้ลองเปิด browser แล้วทดลองเข้าไปใน localhost ดูครับว่าใช้งานได้ใหม? หากใช้ไม่ได้ต้องไปตรวจสอบ service ดูว่า apache ทำงานหรือยัง.. ) [5]

    5.หากต้องการติดตั้ง phpmyadmin เพื่อทำการคอนฟิคดาต้าเบสให้ใช้คำสั่งดังต่อไปนี้ครับ       sudo apt-get install phpmyadmin     [6]  และกรอกรหัสผ่านของ root  ใน mysql ด้วยนะครับ ซึ่งหากถูกต้องก็จะสามารถเปิด phpmyadmin เข้าไปใช้งาน database ได้ตามปกติครับ

    กลับมาที่ ULIB อีกครั้งครับ copy file  ULIB เข้าไปไว้ใน   var/www/   และทำการเปลี่ยน

    chown www-data:www-data ‘/opt/lampp/htdocs/ULIB/inc/config.inc.sv.php’ ;
    chown www-data:www-data ‘/opt/lampp/htdocs/ULIB/inc/config.inc.php’ ;
    chown www-data:www-data ‘/opt/lampp/htdocs/ULIB/inc/c.inc.php’ ;
    chown www-data:www-data ‘/opt/lampp/htdocs/ULIB/webboard/c.inc.php’ ;
    chown www-data:www-data ‘/opt/lampp/htdocs/ULIB/web/c.inc.php’ ;

    จากนั้นเมื่อเปิด browser  ไปที่  localhost/ULIB/install  ก็จะสามารถติดตั้งโปรแกรมผ่านได้เลยครับ !!!!

    หากผู้ที่กำลังเจอปัญหาเรื่อง ULIB  สนใจ   หรือผู้ที่สนใจจะไม่ใช้   xampp หรือ appserv  สามารถดำเนินการติดตั้งแบบผมก็ได้นะครับเพราะผมเคยเจอตอนจะ update phpmyadmin แล้วกลัวมีปัญหา ซึ่งตอนนั้นติดตั้ง  appserv  จึงเกิดปัญหาว่าหากเราติดตั้ง phpmyadmin ตัวใหม่ไปมันจะสามารถใช้งานแทนตัวเก่าได้หรือไม่และจะมีผลอะไรต่อจากนั้นหรือเปล่า ตอนนั้นกว่าจะแก้ได้ก็เหงื่อตกเลยครับ..

     

     

    อ้างอิง

    1.http://www.apachefriends.org/en/xampp-linux.html#388

    2.http://www.howtoforge.com/installing-apache2-with-php5-and-mysql-support-on-ubuntu-12.04-lts-lamp

    3.http://opensource.cc.psu.ac.th/ติดตั้ง_apache_บน_ubuntu

    4.http://www.howtoforge.com/installing-apache2-with-php5-and-mysql-support-on-ubuntu-12.04-lts-lamp

    5.http://www.howtoforge.com/installing-apache2-with-php5-and-mysql-support-on-ubuntu-12.04-lts-lamp

    6.http://opensource.cc.psu.ac.th/ติดตั้ง_phpmyadmin

  • วิธีตั้งค่า PSU Email สำหรับ Outlook Express

    การตั้งค่า Outlook Express ให้ใช้งานกับ PSU Email โดย สมมุติว่า

    1. ผู้ใช้ชื่อ Username Surname ใช้ email address เป็น username.s@psu.ac.th

    2. Incoming Server : mail.psu.ac.th

    และใช้งานผ่าน IMAP

    3. ตั้งค่า Outgoing Server: smtp2.psu.ac.th
    Port: 587
    และมีการเข้ารหัสข้อมูลในการส่ง (STARTTLS ) รวมถึงมีการยืนยันตัวตนก่อน (SMTP Authentication) ทำให้สามารถใช้งานได้จากทั่วโลก

     

    วิธีการตั้งค่า มีดังนี้

    1) ใส่ชื่อและนามสกุล

    001

    2. ใส่ email address

    002

    3. ตั้งค่าการเชื่อมต่อเป็น IMAP

    Incoming mail: mail.psu.ac.th

    Outgoning mail: smtp2.psu.ac.th

    003

    4. ใส่ username และ password ของ PSU Email

    004

     

    5. เสร็จการเริ่มต้นตั้งค่า

    005

    6.  ต่อไป เป็นการตั้งค่าความปลอดภัยอื่นๆ

    ไปที่ Tools > Accounts …

    006

    7. คลิกที่ Mail > mail.psu.ac.th > Properties

    จากนั้นคลิก Tab “Servers” , ในส่วนของ Outgoing Mail Server ให้ติ๊กที่ My Server requires authentication

    คลิกที่ปุ่ม Setting

    คลิกที่ Use same setting as my incoming mail server

    แล้วคลิก OK

    007

     

    8. ไป Tab “Advanced”

    ตั้งค่า Server Port Numbers ของ Outgoing  Mail Server เป็น 587

    และติ๊ก This server requires a secure connection (SSL)

     

     

     

    008

     

    เป็นอันเรียบร้อย

  • วิธีเอา index.php ของ Codeigniter ออกไป (Ubuntu/Linux Mint)

    1.สร้างไฟล์ .htaccess ในโปรเจกของท่าน ดำเนินใส่โค๊ดดังนี้ (สมมุติว่าเป็น /var/www/ci/)

    RewriteEngine on
    RewriteBase /ci/
    RewriteCond $1 !^(index\.php|assets|uploads|robots\.txt)
    RewriteRule ^(.*)$ index.php/$1 [L]

     

    2.เปิด  terminal และพิมพ์คำสั่ง เพื่อเปิด mod_rewrite

    sudo a2enmod rewrite

     

    3.เพิ่ม virtual host ใน /etc/apache2/sites-available/default

    sudo gedit /etc/apache2/sites-available/default

     

    4.เพิ่มโค้ดดังนี้

    <Directory /var/www/ci>
            Options Indexes FollowSymLinks MultiViews
                    AllowOverride All
                    Order allow,deny
                    allow from all             
    </Directory>

     

    5. Restart Apache

    sudo /etc/init.d/apache2 restart

     

    6.ไปที่โปรเจก codeigniter แก้ไขไฟล์  application/config/config.php เอา index.php ออก

    จาก $config[‘index_page’] = ‘index.php’;

    เป็น $config[‘index_page’] = ”;

  • การตรวจสอบหา User ที่โดนหลอกเอา Password บน เว็บเมล์

    วันก่อนได้รับจดหมายแจ้งเตือนว่า กำลังจะทำการปรับปรุงฐานข้อมูล email และจะทำการลบบัญชีที่ไม่ได้ใช้งาน เพื่อขยายพื้นที่ให้กับผู้ใช้รายใหม่ เพื่อเป็นการยืนยันว่าท่านยังมีการใช้งานอยู่โปรดกรอกข้อมูลตาม url ด้านล่าง มิเช่นนั้นบัญชีของท่านจะถูกลบ เมื่อคลิกเข้าไปดูตาม url ก็พบว่ามีช่องให้กรอกข้อมูล ชื่อผู้ใช้ และรหัสผ่าน แหมเจอแบบนี้ถ้าเป็นคนในวงการก็จะรู้ว่าหลอกลวงแน่นอน แต่ก็ยังมีผู้ใช้ที่รู้เท่าไม่ถึงการณ์หลงเชื่อ (จากประสบการณ์จะพบว่าผู้ใช้ทีหลงเชื่อโดยส่วนใหญ่จะเก่งภาษาอังกฤษหรือเป็นชาวต่างชาติครับ)

    Screenshot-1

    เมื่อลองตรวจดูที่ header ทั้งหมดของจดหมายดังกล่าวเพื่อหาว่าต้นตอของจดหมายถูกส่งมาจากที่ใด ก็พบว่าถูกส่งมาจาก 199.83.103.141 ซึ่งเมือตรวจสอบต่อไปก็พบว่าเป็น ip address ที่อยู่ในประเทศสหรัฐอเมริกา

    Screenshot-2

     ก็เลยชักสงสัยแล้วว่าผู้ใช้รายใดกันที่ส่งอีเมล์ฉบับนี้มากจากอเมริกา ก็เลยตรวจสอบจาก log ของเว็บเมล์เพื่อหาดูกิจกรรมของหมายเลข ip ดังกล่าว ก็พบว่า มีผู้ใช้รายหนึ่ง (จากรูปด้าล่างคื sophita.t) ได้ทำการ login โดยใช้ ip ดังกล่าวครับ ดังรูป

    Screenshot-3

    ตรวจสอบใน log ต่อไปก็พบว่า ip นี้มีการส่งจดหมายดังกล่าวจริง

    Screenshot-4

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

    ขั้นแรกจึงได้ทำการปิดกั้นการเข้าถึงไปยังเว็บไซต์ที่หลอกลวงให้กรอกข้อมูลผู้ใช้ก่อน จากนั้นจึงได้ทำการแจ้งเตือนผู้ใช้อื่นๆ แล้วจึงทำการ reset รหัสผ่านผู้ใช้ที่โดนขโมยรหัสผ่าน

  • ติว “DHCP for IPv6 (DHCPv6)”

    Workshop Lab guide dhcpv6 https://sharedrive.psu.ac.th/public.php?service=files&t=d101ba43953c1a7c493b0d507db3b333

    กิจกรรมของ CoP PSU sysadmin ของเราในลำดับต่อไป ติว “DHCP for IPv6 (DHCPv6)” วันที่ 31 พ.ค. 56 เวลา 09.00 – 16.00 น. ที่ห้อง 107 อาคารศูนย์คอมพิวเตอร์ ม.อ.หาดใหญ่

    เพื่อให้ความรู้ความเข้าใจในการจัดการระบบเครือข่ายสำหรับรองรับการใช้งาน IPv6 และฝึกปฏิบัติการติดตั้ง DHCPv6 สำหรับหน่วยงาน

    รายละเอียดหัวข้อติว
    9.00-10.15น. IPv6 Overview
    -IPv6 Addressing
    -IPv6 Address Allocations
    -IPv6 Header Types, Formats, and Fields
    -IPv6 Extension Headers
    -Internet Control Message Protocol for IPv6 (ICMPv6)
    -IPv6 and Routing
    -IPv6 and the Domain Name System (DNS)
    10.30-12.00น. Dynamic Host Configuration Protocol (DHCP) for IPv6
    -Specification Overview
    -Difference from IPv4 Standards
    -Security Ramifications
    -Unknown Aspects
    13.00-16.00น. ทำ LAB ติดตั้งและคอนฟิก DHCPv6 บน Ubuntu

    วิทยากร
    1. พรพิทักษ์ สันติภาพถาวร ศูนย์คอมพิวเตอร์
    ผู้ช่วยวิทยากร
    2. โกศล โภคาอนนท์ ศูนย์คอมพิวเตอร์

    หากท่านสนใจรีบแจ้งอีเมลมาที่ผมโดยตรง ( wiboon.w@psu.ac.th ) หรือทางเฟสบุ๊คของกลุ่ม และผมจะนำรายชื่อมาใส่ไว้ด้านล่างของบล็อกนี้

    รายชื่อผู้เข้าร่วม

    1. วิบูลย์ วราสิทธิชัย ศูนย์คอมพิวเตอร์
    2. วิศิษฐ โชติอุทยางกูร คณะทันตแพทยศาสตร์ (อาหารมังสวิรัติ)
    3. สุนิสา จุลรัตน์ สถาบันสันติศึกษา
    4. ก้องชนก ทองพรัด กองบริการการศึกษา สำนักงานอธิการบดี
    5. ชัยวัฒน์  ศรีจันทร์กุล คณะวิทยาการจัดการ
    6. ฉัตรชัย จันทร์พริ้ม ภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์
    7. อาทิตย์ อรุณศิวกุล คณะศิลปศาสตร์
    8. สุนทรี นภิบาล ศูนย์คอมพิวเตอร์
    9. นิติ โชติแก้ว คณะการแพทย์แผนไทย
    10. จรัล บูลวิบูรณ์ คณะศิลปศาตร์
    11. ประทีป โคตัน ศูนย์คอมพิวเตอร์
    12. ศิริพงษ์ ศิริวรรณ คณะเภสัชศาสตร์
    13. ศุภกร  เพ็ชรรัตน์ คณะทันตแพทยศาสตร์
    14. ทิพาพร พัฒนศิริ ศูนย์คอมพิวเตอร์
    15. หฤทัย สมบูรณ์รุ่งโรจน์ ศูนย์คอมพิวเตอร์
    16. คณกรณ์ หอศิริธรรม ศูนย์คอมพิวเตอร์
    17. เกรียงไกร หนูทองคำ ศูนย์คอมพิวเตอร์
    18. สาวิตรี วงษ์นุ่น คณะมนุษยศาสตร์และสังคมศาสตร์
    19. ลักขณา ฉุ้นทิ้ง คณะมนุษยศาสตร์และสังคมศาสตร์
    20. สงกรานต์ มุณีแนม ศูนย์คอมพิวเตอร์
    21. ยุวภา โฆสกิตติกุล คณะทรัพยากรธรรมชาติ
    22. นวพล เทพนรินทร์ ศูนย์คอมพิวเตอร์
    23. ณัฏฐิกา หัตถกรรม ศูนย์คอมพิวเตอร์
    24. ภูเมศ จารุพันธ์ คณะพยาบาลศาสตร์
    25. กฤตกร อินแพง คณะพยาบาลศาสตร์
    26. พงศ์กานต์ กาลสงค์ คณะแพทยศาสตร์
    27. บัณฑิต ชนะถาวร คณะทันตแพทยศาสตร์
    28. เอกภพ ถาวรจิตร สำนักทรัพยากรการเรียนรู้คุณหญิงหลงฯ (อาหารมังสวิรัติ)
    29. กิตติพัฒน์ อุบลกาญจน์ สำนักทรัพยากรการเรียนรู้คุณหญิงหลงฯ
    30. จอมขวัญ สุวรรณมณี คณะพยาบาลศาสตร์
    31. พันธ์พงษ์ คงกระพันธ์ หน่วยคอมพิวเตอร์ ม.อ. ปัตตานี
    32. สนธยา เมืองโต หน่วยคอมพิวเตอร์ ม.อ. ปัตตานี
  • 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