Linux

Start from minimum, then grow at maximum speed.

Linux : เคยลืมใช้ sudo กันบ้างไหม

ตัวอย่างเช่นผมต้องการย้ายไฟล์ไปที่ ๆ ต้องใช้สิทธิ root เท่านั้น (สิ่งที่ผมพิมพ์เข้าไปที่ Shell คือส่วนที่เป็นตัวหนานะครับ)

karn-mba:~ karn$ mv flasm* /opt/local/bin/
mv: rename flasm to /opt/local/bin/flasm: Permission denied
mv: rename flasm.ini to /opt/local/bin/flasm.ini: Permission denied

ปรากฏว่าลืม sudo ทำให้ติด permission ไม่สามารถย้ายไฟล์ได้

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

karn-mba:~ karn$ sudo mv flasm* /opt/local/bin/

วิธีการปิด Printing Service ใน Samba

วันนี้ set up Samba บน Server ที่ IDC แล้วรู้สึกตะหงิด ๆ เพราะมี error log ที่เกิดจาก Samba ไม่สามารถ connect กับ CUPS (Print Server) ได้
ก็จะ connect ได้ยังไงหละ ก็​มันไม่ได้เปิดนี่ เพราะไม่มี Printer จะต่อด้วย เลยไม่รู้จะเปิดไปทำไม Web Server นะเฮีย

ผมจึงลองมั่วหาวิธีปิด Printing Service ใน Samba อยู่ซักพักจากการอ่าน Online Manual แต่ไม่สำเร็จ เลยขออำนาจพี่กู(เกิ้ล)
ขอปุ๊บ ได้ปั๊บ สั้น ๆ ง่าย ๆ ได้ใจความจาก Link นี้ครับ http://goo.gl/vnPQ2

ให้ใส่ configuration เหล่านี้ไว้ใน [global] section ครับ

 load printers = no
 printing = bsd
 printcap name = /dev/null

Shell Script : Sort list of files by number in filename

วันนี้นั่งดู access_log ของ web server แล้วอยากจะดูความเปลี่ยนแปลงของขนาดของ log file ตามเวลา
ซึ่งถ้าใช้คำสั่ง ls -l access_log* ตามปรกติ จะได้แบบนี้

-rw-r--r-- 1 root root  19777358 Jul  1 20:56 access_log
-rw-r--r-- 1 root root   1045888 Mar 24 04:04 access_log.100.gz
-rw-r--r-- 1 root root    944277 Jun 22 04:05 access_log.10.gz
-rw-r--r-- 1 root root    965624 Jun 21 04:04 access_log.11.gz
-rw-r--r-- 1 root root    328423 Jun 20 04:04 access_log.12.gz
-rw-r--r-- 1 root root    718064 Jun 19 04:04 access_log.13.gz

Network Card Bonding on CentOS 5.4

สมมติมี network card 2 ใบคือ eth0 และ eth1
และเราต้องการสร้าง Trunk ที่มี IP 172.16.0.21 Netmask 255.255.255.0 Gateway 172.16.0.1

ให้แก้ไข file /etc/sysconfig/network-scripts/ifcfg-eth0 ให้มีข้อมูลดังนี้
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
MASTER=bond0
SLAVE=yes

และทำเช่นเดียวกันกับ ifcfg-eth1
เปลี่ยนแค่
DEVICE=eth1

จากนั้นให้สร้าง file /etc/sysconfig/network-scripts/ifcfg-bond0 โดยมีข้อมูลดังนี้
DEVICE=bond0
IPADDR=172.16.0.21
NETMASK=255.255.255.0
NETWORK=172.16.0.0
BROADCAST=172.16.0.255
GATEWAY=172.16.0.1
ONBOOT=yes
BOOTPROTO=none
USERCTL=no

Linux : Sort out unique values

ผมต้องการดูเวลาถึงหลักนาทีที่ไม่ซ้ำกัน จากผลลัพธ์ของ grep -i "no d-channel" /var/log/asterisk/full

ตัวอย่างผลลัพธ์บางส่วน

[May 18 21:22:50] WARNING[5457] chan_dahdi.c: No D-channels available!  Using Primary channel 16 as D-channel anyway!
[May 18 21:22:54] WARNING[5457] chan_dahdi.c: No D-channels available!  Using Primary channel 16 as D-channel anyway!
[May 18 21:22:58] WARNING[5457] chan_dahdi.c: No D-channels available!  Using Primary channel 16 as D-channel anyway!

Linux : Run background process after logout

หากเราต้องการให้คำสั่งทำงานใน background เราสามารถสั่งด้วยการเติม & ต่อท้ายคำสั่ง เข่น

commanda &

แต่การสั่งแบบนี้ ถ้าเรา logout commanda จะหยุดทำงานทันทีเพราะได้รับ hangup signal

ถ้าเราต้องการให้รันไปเรื่อย ๆ ไม่ต้องหยุดเมื่อ logout เราจะต้องใช้คำสั่ง nohup ช่วย ดังนี้

nohup commanda &

โดยการสั่ง nohup คือการระบุไม่ให้ process รับ signal hangup เฉย ๆ ไม่เกี่ยวกับการทำงาน foreground หรือ background
ดังนั้นถ้าเราต้องการให้ run ใน background และ logout ก็ยังทำงานต่อ
เราจะต้องใส่ทั้ง nohup ด้านหน้า และ & ที่ด้านหลังครับ

Shell Script : Sum Numbers By Awk

วันนี้มีบรรทัดเดียวอยู่หมัดมาให้บันทึกอีกแล้ว

เรื่องมีอยู่แว่ เอ้ย ว่า ผมอยากหาว่าขนาด file กลุ่มหนึ่ง ว่ารวมแล้วมีขนาดเท่าไหร่
ถ้าเราใช้ du เพื่อ list ขนาดของ file กลุ่มนั้นก็จะได้ขนาดของ file แต่ละ file ใน 1 บรรทัด

$ du -s test*
1000 testA
2000 testB
3000 testC

โดยไม่มีค่ารวมทั้งหมดให้ ผมจึงใช้ awk เพื่อรวมค่าเหล่านี้และแสดงผลให้ดูดังนี้

$ du -s test* | awk '{sum=sum+$1; print sum, $1, $2;}'
1000 1000 testA
3000 2000 testB
6000 3000 testC

ตัวเลขซ้ายสุดของบรรทัดสุดท้ายก็คือผลรวมของขนาด file กลุ่มที่เราต้องการนั่นเอง

Shell Script : One Line File Iteration Loop

ในบางคำสั่งเราไม่สามารถใช้ wildcard เพื่อระบุชื่อ file ได้ เช่นคำสั่ง tar ที่ผมกำลังใช้งานอยู่

หากเราอยากจะ tar xf หลาย ๆ file ตามลำดับ เราไม่สามารถทำได้โดยใช้ wildcard ครับ
ตัวอย่างข้างล่างนี้ใช้ไม่ได้นะ

tar xf to_be_extract*.tar

ผมจึงต้องใช้ Shell Script ทำ Loop อย่างง่ายเพื่อวน tar x แต่ละ file ดังนี้ครับ

for f in to_be_extract*.tar; do echo $f; tar xf $f; done

เป็นอันเสร็จ

CentOS : วิธีการลงโปรแกรมเป็นกลุ่ม

วันนี้ได้เข้าไปลง GlusterFS ที่ server ที่ฝากคนอื่นลง ​CentOS ไว้แล้วพบว่าลงไม่ได้เนื่องจากพบ error นี้

err: cannot create %sourcedir /usr/src/redhat/SOURCES

เดาว่าตอนที่ลงไม่ได้เลือก Development ไว้ และผมก็ยังไม่เคยลง package พวกนี้ทีหลัง
เพราะปรกติจะเลือกตั้งแต่แรก เลยต้องหากันหน่อยว่า yum มันทำยังไง แล้วก็พบวิธีนี้

yum groupinstall 'Development Tools'

เท่านั้นแหละลง GlusterFS ได้แล้ว เรียบร้อย ^_^

Credit: http://www.cyberciti.biz/faq/centos-linux-install-gcc-c-c-compiler/

Shell Script : One Line Infinite Loop

เราสามารถใช้คำสั่ง watch เพื่อทำคำสั่งซ้ำกันไปเรื่อย ๆ ทุก ๆ x วินาทีอยู่แล้ว
แต่ข้อเสียของ watch คือ screen จะถูก clear ทุกครั้ง ทำให้เราไม่สามารถเห็นผลลัพธ์เก่า ๆ ได้

ผมจึงต้องหาวิธีการทำ Loop ด้วย Shell script เพื่อทำคำสั่งซ้ำ ๆ กันไปเรื่อย ๆ แบบง่ายและเร็ว
ซึ่งได้วิธีนี้มาครับ

while [ 1 ]; do command1; command2; command3; sleep x; done

เช่น
เราสามารถตรวจสอบจำนวน tracking connection ของ firewall ทุก ๆ 1 วินาที ใน 1 บรรทัดด้วยวิธีนี้

while [ 1 ]; do cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count; sleep 1; done

ข้อดีของการทำ Loop ด้วยวิธีนี้แทน watch ก็คือ

Syndicate content