Showing posts with label process. Show all posts
Showing posts with label process. Show all posts

Tuesday, July 3, 2012

UNIX Programming

ไปขึ้นสวรรค์น่ะพี่น่ะ
ใน ตอนที่ผ่านมา ได้กล่าวถึงการ overlay ทับหน่วยความจำ ของ process เดิมด้วย process ใหม่ ที่สร้างขึ้น ด้วยคำสั่ง execl แล้วบอกว่า เป็นการทำงานทางเดียว ไปแล้วไปลับ ไม่มีกลับมาอีก ทำนองนี้

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

เออก็ นี่พ่อ พ่อไปขึ้นสวรรค์เสียเถอะน่ะพ่อน่ะ

อะไรประมาณนี้ พร้อมกับมอบหมายงานบางอย่างให้ไปทำบนสวรรค์ ว่ายังงั้น จะชั้นไหนก็ช่างเหอะน่า

ในเรื่องของ process ก็คงคล้ายๆกัน กล่าวคือ เมื่อเราสั่งให้วิ่ง process ใหม่ด้วยคำสั่ง execl แล้ว เกิดมีข้อผิดพลาดขึ้น เรื่องกลับไม่ได้จบ ณ ตรงนั้น มันย้อนกลับมาหาตัวผู้สั่งการเอง มามีเรื่องกันตรงนี้ ดั่งตัวโปรแกรมสั้นๆ ข้างล่างนี้

/*
 * exec-return.c
 */

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    execl("/usr/local/bin/heaven", "heaven", NULL);
    fprintf(stderr,"Some one stole 'heaven', heaven closed.\n");
}


ข้อผิดพลาด มันเกิดขึ้น เพราะหาสวรรค์ไม่เจอ อันเนื่องมาจาก เราไปกำหนด ตำแหน่งแห่งหน ของสวรรค์ไว้ผิดที่ ผิดทางนั่นเอง  ซึ่งจะยังผลให้ process ใหม่ที่วิ่งอยู่นี้ ไม่สามารถทำงานได้ จึ่งต้องกลับมายังผู้สั่งการ แล้วเจอคำสั่งให้พิมพ์ข้อความ "Some one stole 'heaven', heaven closed.\n" ออกทาง standard error แล้วจึงปิด case จบงานกัน ที่ main นั่นเอง

ลองคอมไพล์โปรแกรมข้างบนนั้นดูซิ น่ะ

% cc -o myjob exec-return.c

แล้วลองเรียกดูด้วยคำสั่งนี้

% ./myjob

อันนี้ ก็เป็น หนึ่ง ในข้อยกเว้น ที่เกิดขึ้น ข้อยกเว้นที่ว่า เมื่อสั่ง exec แล้ว มันจะทำงานไป และจบงานตรงนั้น ไม่มีกลับมายังตัวผู้สั่งอีก

นี้ ขอคั่นรายการ ก่อนจะนำเสนอเรื่องราวของ process ในตอน process control ซึ่งจะว่าไป น่าจะเป็นการ create เสียมากกว่า แต่ก็อย่างว่า วิชาการเรื่องนี้ คนไทย ไม่ได้สร้าง/ผลิตขึ้น เขาว่ามายังไง ก็ต้องว่าไปยังงั้น อย่างมากก็แค่ท้วงติงไป ซึ่งอาจจะได้ผล ไม่ได้ผล ก็แล้วแต่ว่า เจ้าของนั้น จะรับฟังหรือไม่ (หรืออีกที ก็ เจ้าของนั้น จะยังมีชีวิตอยู่หรือเปล่า)

ลป.  ลืมไปว่า ใน FreeBSD นั้นไม่มีแฟ้ม /usr/local/bin/heaven ครับ หาก UNIX รสชาติที่ท่านใช้นั้นมี heaven ดูให้ดีดีก็แล้วกัน ยังไงเสียก็ อ่าน man heanven, คู่มือสวรรค์, ให้ละเอียดน่ะครับ

Tuesday, June 26, 2012

UNIX Programming


“Process”
ได้เคยเขียนเรื่องของ process ไว้บ้างแล้ว ใน blog นี้, fork, แต่ขอเริ่มใหม่อีกครั้ง ให้อยู่ในหัวข้อของ UNIX Programming ไปเลยด้วยกันนี้

หลักการทำงานของ UNIX เท่าที่คลุกคลีมาคือ หากมีของอยู่แล้ว ก็ใช้ของนั้นมาทำงานให้ ไม่ต้องสร้างของนั้นขึ้นมาใหม่อีก และเพราะเหตุนี้ ใน FreeBSD จึงเต็มไปด้วย tools เพื่อใช้งาน เพื่อให้แต่ละงาน ช่วยงานอื่นให้สำเร็จลุล่วงไปได้

โดยหลักอันนี้เอง ทำให้เรา เรียกโปรแกรมอื่น มาทำงานให้เราขณะที่เราก็กำลังวิ่ง process ของเราอยู่ ซึ่งก็คือสิ่งที่ได้เขียนไป และ ให้ลิงค์ไว้ข้างบนนั้น นั่นเอง

(๓.๑) “system” ฟังก์ชั่น
เราใช้บริการของฟังก์ชั่นใน system library ชื่อ system เรียกโปรแกรมระบบ ในตัวอย่างนี้คือโปรแกรมชื่อ date มาช่วยงานได้ ดังนี้

#include <stdlib.h>

main()
{
    system("date");
}

ซึ่งในชีวิตจริง คงไม่ใช่โปรแกรม date นี้หรอก เป็นแต่เพียงยกตัวอย่างมาให้เห็นว่า การเรียกใช้บริการของฟังก์ชั่นใน system library นั้นกระทำกันผ่านช่องทางไหน  อนึ่ง ท่านสามารถ เขียน คำสั่งที่จะส่งผ่านให้ฟังก์ชั่น system ผ่านทางฟังก์ชั่น sprintf ได้

แต่ถึงอย่างนั้น วิธีการนี้ก็ยังคงมีข้อจำกัดอยู่ ตรงที่ว่า buffer output นั้นเราต้อง flush เอาเอง

(๓.๒) “Process Creation – execl & execv”
จะเห็นว่า แม้ฟังก์ชั่น system จะอนุญาตให้เรา เรียกโปรแกรม จากระบบปฏิบัติการ มาทำงานให้เราได้  แต่บางครั้ง ยังรู้สึกอยู่ว่า เราน่าจะทำอะไร มากกว่านั้นได้ กับ process ที่จะวิ่งงานให้นี้

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

/*
 * execl routine
 */

#include <unistd.h>

int main(int argc, char *argv[])
{
    execl("/bin/date", "date", NULL);
}

execl จะทับหน่วยความจำของโปรแกรมเดิมหมดสิ้น ดังนั้น จึงไม่สามารถ ที่จะกลับมาหา สถานะเดิม ได้อีกแล้ว เมื่อ execl ได้ทำงานเสร็จสิ้นแล้ว จึงมีแต่ ทำงานแล้วตายไปเลย อยู่ที่ว่า
  • สุคติ ทำงานสำเร็จ exit status 0 หรือ 
  • ทุคติ ทำงานไม่สำเร็จ มีปัญหา exit status ไม่เป็น 0

อีกหนึ่ง routine ที่คล้ายๆกับ execl คือ execv ที่อนุญาตให้ท่าน สร้างองค์ประกอบต่างๆ ของคำสั่งที่จะเรียกใช้งานได้ โดยมีวิธีการเรียกใช้งาน ดังนี้

int execv(const char *pathname, const char *argv[]);

ทั้ง ๒ routine นี้ เมื่อจะเรียกใช้งาน ต้องรวมแฟ้ม unistd.h เอาไว้ด้วย   ขอให้ท่านอ่าน execl(3) ด้วย และสำหรับรายละเอียดอื่นๆ จากเอกสารอ้างอิง หมายเลข ๓ บทที่ ๘  หัวข้อ process control

Wednesday, May 23, 2012

FreeBSD: สภาวะแวดล้อมการทำงาน single user mode

จากทั้งสองตอนที่ผ่านมา ไม่ว่าจะเป็น single user mode หรือ การเพิ่ม hard disk ก็พอเพียงที่จะนำไปสู่สาระในเรื่องการทำงานภายใต้สภาพแวดล้อมโดดเดี่ยว เป็นอิสระจากการรบกวนของ process อื่นๆที่ไม่จำเป็นกันได้แล้ว

ต้นเหตุของเรื่อง เกิดจากการ compile แล้วเครื่องดับไปเพราะความร้อนที่ตัว cpu สูงมาก เลยตัดใจมาทำงานใน single user mode เพื่อลดการทำงานของ process ที่ไม่เกี่ยวข้อง ที่ไม่จำเป็นออกไปให้หมด

ปกติ มะไฟ กำหนดให้ compile โปรแกรมพวก ports ทั้งหลายไว้ที่ partition อื่น ที่ไม่ใช่ /usr/ports โดยกำหนดเป็น ตัวแปรสภาพแวดล้อม ดังนี้

${WRKDIRPREFIX}

และที่สำหรับเก็บพวก source files ในรูปของ .tar.gz ก็เก็บไว้ที่ตามแต่ตัวแปรสภาพแวดล้อมจะชี้ไป ซึ่งตัวแปรสภาพแวดล้อมนี้คือ

${DISTDIR}

แล้วก็ส่วนที่เป็นสันดาน หรือนิสัยแปลกๆอีกอย่างคือ เมื่อ compile โปรแกรมได้แล้ว มักจะเก็บไว้เป็น packages ไปเสียด้วยเลย และก็เช่นกัน เก็บไว้ที่ไหน ก็ตามแต่ตัวแปรสภาพแวดล้อมจะชี้ไป ซึ่งทาง FreeBSD เขาก็กำหนดมาให้แล้วว่า เป็นตัวแปรชื่อ

${PACKAGES}

เหล่านี้ ดังนี้ เป็นต้น และก็ไม่ต้องแปลกใจว่า จะไปกำหนดให้ชี้ไปที่ไหน ตามนี้เลยครับ อย่างที่นึก อย่างที่คาดเดากันไว้แหละ

WRKDIRPREFIX=/kaitag/MNI
DISTDIR=/kaitag/distfiles
PACKAGES=/kaitag/packages

สามบรรทัดข้างบนนี้ ให้ท่านเขียนไว้ในแฟ้ม /etc/make.conf เลยครับ

อ้อๆ ทั้งสามสาระบบแฟ้มนั้น เป็นเจ้าของโดย root:wheel น่ะครับ ไม่งั้น เขียนลงไม่ได้

ลักษณะนิสัยอีกประการ (ที่อาจจะสร้างเสริมมาโดยหลักสูตรใหม่มั้ง) คือเมื่อเวลาสร้างโลกนั้น ระบบจะเขียนลงไปในสาระบบแฟ้ม /usr/obj ที่ดูทีไร ก็ไม่ชอบใจเลย เลยขอยักไปไว้ใน /kaitag/obj ด้วยเสียเลย โดยกำหนดให้เป็น ตัวแปรสภาพแวดล้อม ชื่อ MAKEOBJDIRPREFIX และให้เขียนไว้ที่แฟ้ม /root/.profile ดังนี้ครับ

MAKEOBJDIRPREFIX=/kaitag/obj
export MAKEOBJDIRPREFIX

ทั้งนี้ก็เพื่อว่า เมื่อท่านลงสู่ single user mode แล้ว จะได้ไม่ต้องมาเสียเวลาเขียนอีก

สรุป

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

MAKEOBJDIRPREFIX=/kaitag/obj
export  MAKEOBJDIRPREFIX

alias  rm='rm  -i'
alias  mv='mv  -i'
alias  cp='cp  -i'
alias  ll='ls  -lA'

set  -o  vi
set  autolist

และสำหรับแฟ้ม /etc/make.conf ขอให้เพิ่มบรรทัดดังต่อไปนี้น่ะครับ

WRKDIRPREFIX=/kaitag/MNI
DISTDIR=/kaitag/distfiles
PACKAGES=/kaitag/packages

ก็คงพอให้ท่านทำงานได้ และหวังว่า คงไม่ลืม ๔ คำสั่งแรก หลังจากได้รับ shell เมื่อก้าวลงสู่ single user mode แล้ว

# swapon -a
# adjkerntz -i
# mount -a
# umount /home

ก็คงจบสาระที่วางไว้เพียงเท่านี้ และขอได้รับการขอบคุณจาก มะไฟ  สำหรับเวลาที่ท่านสละมาอ่าน
ลป. หวังว่าคงจำวิธีการ และ ข้อกำหนดในการเก็บ packages ได้น่ะครับ ว่า ท่านต้องสร้างสาระบบแฟ้ม ${PACKAGES}/All ไว้ก่อนด้วย โดยสั่งเพียงหนเดียว
#  mkdir  -p  ${PACKAGES}/All

Tuesday, May 22, 2012

FreeBSD: สภาวะแวดล้อมการทำงาน single user mode

มูลเหตุ ที่ต้องเขียนเรื่องนี้ขึ้นมานั้น ก็เนื่องมาจากการที่ต้องลงไปทำงานใน single user mode บ่อยครั้งเป็นพิเศษ ในระยะนี้ ทั้งนี้เพราะต้องการลดการทำงานของ process อื่นๆลง เพื่อไม่ให้อุณหภูมิของ cpu สูงเกินไป

อุณหภูมิของ cpu สูงนั้นเกิดจากการที่ไป compile บางโปรแกรมเข้า ซึ่งก็ให้งุนงงงไปหมดทั้งตัวเหมือนกันว่า มันเขียนโปรแกรมของมันยังไง ถึงกับให้ cpu ทำงานหนักมาก จนความร้อนขึ้นสูงขนาดนั้น 102.5 c เลยครับ

โปรแกรมที่ว่านี้ก็ได้แก่ gcc, firefox, chromium, boost-*, openjdk, openoffice, libreoffice พวกนี้ โดยเฉพาะอย่างยิ่ง ตัวหลังสุดเนี่ย ยอดเยี่ยมกระเทียมดองเอาเลยทีเดียวเชียว

พอสั่ง make ทีไร พวกเป็นต้องไปไล่ตั้งแต่ต้นใหม่ไปเสียทุกครั้ง

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

สิบนาฑีครับ ใช่ครับ เครื่อง compile ไม่เกินไปกว่า 10 นาฑี ก็ดับ ซึ่งพอดับ บางทีต้องมาเสียเวลาทำ ฟิ้สกี้ ก่อนอีกถึงจะทำงานต่อไปได้

เลยตัดใจลงมาทำงานที่ single user mode เสียเลยดีกว่า ซึ่งทำให้บาง partition นั้นไม่ต้อง mount ด้วยซ้ำไป

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

ดังนั้น เมื่อลงสู่ single user mode แล้ว สิ่งที่ต้องทำเป็นลำดับแรกหลังจากได้รับ shell มาแล้ว (ซึ่งก็คือ sh) ก็ได้แก่ลำดับคำสั่งพวกนี้

# swapon  -a
# adjkerntz  -i
# mount  -a
# umount  /home

# alias  rm='rm -i'
# set  -o  vi
# set  autolist

ทั้งนี้ หมายความว่า file system ทุกตัวต้องสะอาด ไม่ต้องมาเสียเวลาทำ fsck กันอีกน่ะครับ
ขออธิบายไปทีล่ะคำสั่ง ดังนี้ครับ
  1. swapon -a อันนี้ เป็นการ mount swap file system ให้กับระบบครับ ต้องทำ แล option a  นั้นก็หมายถึงว่า หากเรากำหนดว่าเครื่องนี้มี swap file system กี่ file systems ก็เอามาให้หมดแหละ
  2. adjkerntz -i อันนี้เป็นการกำหนด CMOS clock ให้กับ kernel ครับ เรื่องเวลา สำคัญมาก
  3. mount -a อันนี้ เป็นการ mount ทุก file system ที่เครื่องมีอยู่ option a หมายถึงว่า all ครับ  แต่ในตอนที่เราอยู่ใน mode นี้ ไม่มีการ login ดังนั้น partition home จึงไม่ต้องใช้ ซึ่งเราจะ un-mount เอาทีหลัง ง่ายกว่ากัน
  4. umount /home อธิบายแล้ว ในข้อบนนั้นครับ
  5. alias rm='rm -i' คำสั่งนี้ บังคับว่า หากจะลบ ต้องถามเพื่อยืนยันไปก่อนลบ ทุกครั้งไป ป้องกันไว้ ดีกว่าเสียใจในภายหลังครับ  โดยเนื้อแท้ ต้องทำสำหรับคำสั่ง cp, mv ด้วย แต่เขียนมาเพียง ๑ คำสั่ง ก็พอ
  6. set -o vi เป็นการทำให้ทำงานด้วย keyboard ได้สะดวกขึ้น ปุ่มต่างๆ จะมีหน้าที่แบบเดียวกับที่ใช้งานบน vi เลยครับ
  7. set autolist อันนี้ก็เป็นตัวอำนวยความสะดวกอีกอย่างหนึ่งให้กับการทำงานใน mode นี้ กล่าวคือ เป็น file name completion mechanism นั่นเอง  ก็ลองนึกๆดูว่า ถ้าจะพิมพ์แค่ cd /usr/ports/editors/libreoffice แค่นี้ หากต้องกดแป้นพิมพ์ไปทุกตัว ก็ เหนื่อย ท้อ แล้วครับ  ใช้ปุ้ม tab บนแป้นพิมพ์ครับ สำหรับ เติมเต็มชื่อแฟ้มที่ยังขาดหายไป ซึ่งตามตัวอย่างที่ยกมา เราพิมพ์แค่ cd /u<tab>po<tab>edit<tab>libreoff  ในเมื่อ <tab> คือการกดปุ่ม tab ครับ

ตัวแปรสภาวะแวดล้อมทำงานพวกนี้ สามคำสั่งหลังนั้น เราสามารถกำหนดไว้ในแฟ้มได้เลยครับ ไม่ต้องมาลำบากกรอกคำสั่ง ไปเสียทุกครั้งที่ลงมาทำงานใน mode นี้  ให้นำ ๓ คำสั่งหลังที่ยกมานี้ ไปไว้ในแฟ้ม /root/.profile ครับ เขียนต่อท้ายไปจากของเดิมเลยน่ะครับ

ตัวแปรสภาพแวดล้อมการทำงานอื่นๆ ที่เห็นว่าจะอำนวยความสะดวกให้ ก็ลงไว้ในแฟ้มนี้ได้ด้วยเช่นกันครับ ส่วนใหญ่จะเป็น alias เช่น ll ซึ่งก็เท่ากับเรียกใช้ ls -FlA ครับ

อ้อ สำหรับข้อที่ 6 set -o vi นั้น มันช่วยให้ท่านเรียกคำสั่งเก่าๆขึ้นมาทำงานได้ ด้วยการกด ปุ่มลูกศรขึ้น  ครับ

Monday, January 24, 2011

fork

ท่านจะ fork ไปทำไม ถ้าไม่ต้องการแยกงานออกเป็น ๒ หรือ หลาย process ?
นี่คือสิ่งที่เพียรบอกน้องที่ถามใน thaibsd.com ในกระทู้ เรื่องที่จะให้โปรแกรมทำงาน ๕ วินาที

พอดี เรื่องที่เขียนไว้ ที่เกี่ยวข้องกับ process นั้น ปนเปไว้ในนี้แหละ แต่หายาก เพราะเขียนไว้นานแล้ว ตอนหลังจึงทราบว่า เขียนในเรื่องของ Literate programming ในคราวต่อสัญญา เลยบอกไปใน บอร์ด 


ถ้าน้องที่ถามไว้ แวะเวียนมาดูอีกครั้ง ก็รบกวนไปดูโดยละเอียดได้ตรงเรื่องของ literate programming ในด้านซ้ายมือนั่นแหละ หรือจะ click ที่คำสำคัญด้านล่างในนี้ก็ได้ครับ

แล้วจะมาเติมเต็มให้อีกครั้งน่ะ ขอเตรียมตัวไปทำงานก่อนหละ วันจันทร์ รถติดมาก

มาต่อกันอีกนิด เน้าะ
ในเอกสารที่เขียนขึ้นนั้น fork() โปรแกรมตรงจุดที่เรียก gnuplot มาทำงานต่อ แล้ว parent รอจนกว่า child process จะจบงาน โดย main() นั้นคือ parent ดังนี้

    if ((fork()) == 0) { /* child process */
         if (interactive)
                  execlp("/usr/local/bin/gnuplot","/usr/local/bin/gnuplot",(char *)0);
         else

                  execlp("/usr/local/bin/gnuplot","/usr/local/bin/gnuplot","jotawski.cmd",(char *)0);
    } else { /* parent wait here */
         wait(&sflag);
    }

ส่วนในเรื่องของคำสั่ง execlp() และพวกเขานั้น ไปอ่านดูใน manual page ได้ สำหรับที่ มะไฟ เขียนนี้ ใช้การเรียกแบบ list path เอา คือมี arguments กี่ตัว ก็ list ออกมา และบอก path ไว้เลย

สำหรับ case ของน้อง peposo นั้น บอกว่าตั้งเวลา ๕ วินาฑี เวลานี้ เริ่มวัดจากตรงไหน  ถ้าเริ่มตรงส่วนของ child ก็ใส่ใน ส่วนของ pid==0 ไป ง่าย ไม่งั้น ลำบากมากมีแต่เทพฯจึงกำหนดได้ว่า เมื่อเริ่ม load มันกินเวลาไปกี่มากน้อยแล้ว เผลอๆ มันเกิน ๕ วิน่าฑีไปแล้วด้วยยย

Thursday, August 5, 2010

FreeBSD: --> Log files

commandsการดูบันทึกการปฏิบัติงานนั้น หรือ การอ่านรายงานการประชุมนั้น มีประโยชน์มาก แต่ต้องหมายถึงว่ารายงานนั้น ต้องบันทึกตามความเป็นจริงที่เกิดขึ้น ซึ่งสำหรับการประชุมแล้ว ต้องมีการรับรอง แก้ไขรายงาน ...ฯลฯ

โฮ้ยยย จิปาถะ

แต่กับ log file ที่บันทึกโดยระบบปฏิบัติการคอมพิวเตอร์แล้ว เกิดอะไรขึ้น เขาก็บันทึกแหละ ตามที่กำหนดไว้ เพราะฉนั้น หน้าที่เราก็มีเพียง ตั้งหน้าตั้งตาอ่าน อ่านเอาเรื่อง

จับผิด จับถูกแก้ไขปัญหาได้เยอะ รวมทั้งป้องกัน ก็ได้มากเหมือนกัน

การอ่านให้เป็นนิสัย นับว่าเป็นการเขียนที่ดีอย่างหนึ่ง ซึ่งพอพกับการพูดที่ดีนั้น นักพูดที่ดี ต้องเป็นนักฟังที่ดีด้วย เอ แล้วมันจะไปด้วยกันได้มั้ยเนี่ย แต่เอาเหอะ อ่านก็แล้วกัน เน้อะ

log file ต่างๆของระบบนั้น จะเก็บไว้ที่ /var/log
ซึ่งก็มีตั้งแต่การ login, ftp, maillog, messages ต่างๆ เหล่านี้ FreeBSD เขาจัดไว้ให้แล้ว และจะ rotate ไปเรื่อย หน้าที่ของเราคือ อ่าน และ พิจารณา และ ปฏิบัติการตามสมควรแก่กรณี เป็นราย ราย ไป

ยกตัวอย่าง ที่สืบเนื่องมาจากเรื่อง Apache ที่ผ่านไปหยกหยกนี่ ก็ให้ท่านลองลง apache22 ให้เรียบร้อย แล้วปรับแต่งแฟ้ม httpd.conf ให้พอมีสาระเท่าที่จำเป็น ในเบื้องต้น ดังนี้

  • ServerAdmin ชื่อของท่าน เป็นอีเมล์
  • ServerName localhost:80
  • #Include etc/apache22/extra/httpd-default.conf
  • #Include etc/apache22/extra/httpd-ssl.conf
๒ ข้อหลังนี่ นำเอามาให้ดูเพราะอยากให้ท่านฝึกอ่าน log file ว่า ถ้าในสภาพปกติ จะเป็นอย่างไร และในสภาพผิดปกติ ความแตกต่างจะเกิดขึ้น ซึ่งท่านย่อมทราบเอง ปัจจัตตัง วิญญูหิติ ๚

เมื่อลงแล้ว ปรับแฟ้มดังกล่าวแล้วให้ท่านสั่ง, ในฐานะ root น่ะ
# /usr/local/etc/rc.d/apache22 start
และถึงอย่างไรก็ดี อย่าเพิ่งเชื่อในสิ่งที่เห้นในหน้าจอให้มากนัก จงตรวจสอบว่า อะปะเช่ เขาวิ่งจริงหรือว่า วิ่งไปแล้วแอบนอนแบบกระต่าย ด้วยคำสั่งอีกอันนี้
# /usr/local/etc/rc.d/apache22 status
และงวดนี้ ให้จำผลลัพธ์ที่หน้าจอไว้ด้วย แล้วไปเปิดแฟ้ม log file ดูอีกที


แฟ้ม log ก็อย่างที่เห็นในรูปแหละว่า ชื่อ httpd-access.log จากรูปนี่
มะไฟ ใช้ editor เปิดมาให้ดู ความจริงแค่สั่ง
# tail -20 /var/log/httpd-access.log
ก็พอแล้ว ยังไงก็ตามทีเหอะ จาก log file นี้ บอกว่าไม่มี errors อะไร โดยดูจาก ๕ บรรทัดสุดท้าย ที่วงแดงแดงไว้นั่นแหละ

ยังไงก็แล้วแต่ ขอให้พี่พีท่านสั่ง
# tail -20 /var/log/httpd-error.log
มาดูด้วยน่ะ งวดนี้ สั่งมาดูเปล่าๆได้ เขาไม่คิดตังหรอก คริคริ

เรามาทดลองกันดูง่ายๆ สำหรับ อะปะเช่ ลองดูว่า ถ้า hostname & ip number ไม่ได้กำหนด แล้ว อะปะเช่ จะวิ่งรึเปล่า แล้ว log file ทั้งสองจะแจ้งอย่างไร ก็ให้ท่านไปลองดูเอง ลองเปลี่ยน ServerName ในแฟ้ม httpd.conf เป้นอย่างอื่นเลย ง่ายดี แล้วสั่ง

# /usr/local/etc/rc.d/apache22 restart
เบื้องต้น ก็ให้ดูผลลัพธ์ที่หน้าจอ, standard error, ก่อน แล้วไปดู httpd-access.log กับ httpd-error.log ทั้ง ๒ แฟ้มว่าจะรายงานอย่างไร ให้สังเกตุเอาเอง

จากนั้น แก้ ServerName คืนกลับมาเป็นชื่อเดิม แล้วก็เริ่ม process ของ อะปะเช่ ใหม่อีกครั้ง

log file อื่นๆ ก็ให้อ่านแบบฟอร์มการบันทึกของเขาก่อน แล้วจึงไปนั่งอ่านตัว log file จะทำให้เข้าใจอะไรได้ง่ายขึ้นเยอะ อย่างกับว่า วันนี้ ระหว่าที่ชะงักไป มีพี่ท่านหนึ่ง มาถามว่าจะดูว่าเครื่องดับช่วงไหน ซึ่ง ก็พอดีที่เจอ เลยบอกว่า ไปดูผลลัพธ์จากคำสั่ง last(1) ซะ แต่พี่ท่านใช้อูบุ้นตู เลยบอกไม่ได้ ก็แต่บอกให้พี่เขาค่อยๆไล่ลงไปดูทีละบรรทัดๆ จากบนลงไปหาล่าง ก็น่าจะเจอเหตุเองแหละ ว่า เครื่อง มันดับเมื่อไหร่ เพราะอะไร กับอีกหนึ่งคำสั่งคือ lastcomm(1) ซึ่งพอใช้ดูได้เช่นกัน

ขอยุติเรื่องของ Log file ไว้ตรงนี้ก่อนชั่วคราว ขอบคุณทุกท่านที่สละเวลาอ่าน ๚

View My Stats