ในระบบเชลล์ของยูนิกซ์เวลาที่เราต้องการจะสั่งให้โปรแกรมทำงานแบบแบ็คกราวน์ จะทำโดยเรียกโปรแกรมนั้นพร้อมกับระบุเครื่องหมาย &
ต่อท้าย เช่น
แต่เราจะพบปัญหาเวลาที่ต้องการให้โปรแกรมที่สั่งให้ทำงานแบบแบ็คกราวน์นั้นทำงานต่อไปแม้ว่าเราจะออกจากระบบไปแล้ว เนื่องจากเวลาเราออกจากระบบ (logout) จะมีการส่งสัญญาณ SIGHUP (hangup) ไปยังโปรเซสทั้งหมดของเราที่กำลังทำงานอยู่ ซึ่งพฤติกรรมโดยปกติของโปรเซสเมื่อได้รับสัญญาณก็คือ หยุดการทำงานแบบไม่ปกติ (abnormal termination) จึงทำให้โปรแกรมที่เราหมายมั่นปั้นมือว่าจะให้ทำงานไปตลอดคืนนี้ หยุดทำงานไปโดยไม่รู้ตัว (กว่าจะรู้อีกทีก็อาจจะเช้าแล้ว ต้องเสียเวลารออีก)
วิธีการแก้ปัญหานี้มีหลายวิธี วิธีที่ยุ่งยากหน่อยก็คือแก้โปรแกรมโดยเรียกใช้ system call เพื่อดัก SIGHUP ไว้ โปรแกรมของเราจะได้ไม่ทำตามพฤติกรรมปกติซึ่งก็ดูจะยุ่งยากไปหน่อย และไม่สามารถใช้กับโปรแกรมที่ไม่เปิดเผยโค้ดได้ อีกวิธีหนึ่งก็คือการใช้โปรแกรม nohup ซึ่งจะทำตัวเป็นเหมือนเชลล์ห่อโปรแกรมของเราไว้อีกชั้นหนึ่ง โดยจะดักสัญญาณ SIGHUP ไว้ ทำให้โปรแกรมทำงานต่อไปหลังจากออกจากระบบ เช่น
แต่ข้อเสียของโปรแกรม nohup ก็คือแม้ว่าเราจะกลับเข้ามาในระบบใหม่ เราก็จะไม่สามารถติดต่อหรือดูผลการทำงานของโปรแกรมได้ ผลลัพธ์ทั้งหมดจะต้องเก็บลงไฟล์ไว้ก่อนเท่านั้น ทำให้ไม่สะดวกเท่าที่ควร
screen เป็นโปรแกรมบนยูนิกซ์อีกโปรแกรมหนึ่งที่ช่วยอำนวยความสะดวกในการรันโปรแกรมแบบนี้
screen จะทำงานคล้าย nohup เพียงแต่ว่าเมื่อเริ่มทำงาน screen จะทำให้ดูเหมือนว่าโปรแกรมของเราทำงานเป็นแบบฟอร์กราวน์ตามปกติทั่วไป เราสามารถสั่งให้ทำงานเบื้องหลังได้ โดยกด CTRL-A CTRL-D ต่อกัน โปรแกรมก็จะไม่เชื่อมต่อกับเทอร์มินัล แต่จะทำงานในแบบแบ็คกราวน์ แต่เราสามารถกำหนดให้ screen เรียกโปรแกรมของเราที่ทำงานอยู่ให้กลับมาอยู่เบื้องหน้าอีกครั้งได้ แม้ว่าเราจะออกจากระบบไป และกลับมาใหม่แล้วก็ตาม
ในกรณีที่เรียกใช้ screen พร้อมกันหลายๆ โปรเซส ก็อาจจะต้องระบุรหัสโปรเซสที่ต้องการเรียกกลับมาบนเทอร์มินัล โดยอาจจะใช้ออปชัน -ls เพื่อแสดงโปรเซสของ screen ทั้งหมดก็ได้ นอกจากนี้ screen ยังมีออปชันให้เกิดสิ่งที่เป็นผลลัพธ์ทั้งหมดลงไฟล์ไว้ให้ด้วยก็ได้ ทำให้สะดวกในการเรียกดูผลลัพธ์ภายหลัง ผมเองก็ต้องพึ่งโปรแกรม screen เยอะเลยทีเดียวกว่าจะเรียนจบมาได้
รายละเอียดเพิ่มเติม: http://www.gnu.org/software/screen/
วันก่อนได้หนังสือรวมคำบรรยายของท่านพุทธทาสภิกขุ เรื่อง “เห็นโลกเป็นของว่าง” มา เริ่มแรกท่านพูดเกี่ยวกับ อุณหิสสวิชโยวิจยกถา ซึ่งเป็นคาถาที่หลายคนเชื่อว่าเป็นการต่ออายุ โดยนำคาถาทั้งหมดมาแปลออกเป็นภาษาไทย ซึ่งก็ไม่ได้มีความหมายพิเศษอะไร
เป็นเพียงธรรมะขั้นพื้นฐาน แล้วท่านก็กล่าวว่า
ธรรมะที่เป็นหัวใจในพระพุทธศาสนา คือเรื่องสุญญตาก็ดี เรื่องอนัตตาก็ดี ผู้ใดเข้าถึงธรรมนั้นแล้ว ย่อมอยู่เหนือความตาย, ย่อมพ้นจากความตาย ย่อมไม่มีความตายเลยโดยประการทั้งปวง เพราะหมดความเป็นตัวเป็นตน เป็นสัตว์เป็นบุคคล เพราะไม่มีอุปาทานยึดมั่นสิ่งใด …
อ่านแล้วยิ่งเข้าใจในพุทธศาสนามากขึ้น พระพุทธองค์ไม่ได้พยายามให้เราทำสิ่งที่เหนือธรรมชาติ หรือเพ้อฝันถึงสวรรค์วิมานอะไรในโลกหน้า แต่ให้เราฝึกจิตใจตนเอง ให้ยอมรับในสิ่งที่กำลังจะเกิดขึ้น ตามธรรมดาของโลกนี้ แต่จะปฏิบัติตนอย่างไร ให้ยอมรับได้นั้น ยังเป็นเรื่องยากเหลือเกินสำหรับผม
ผมมักจะมีปัญหาเสมอในการใช้งานโปรแกรมต่างๆ ผ่านเน็ตเวิร์ค เนื่องจากที่ทำงานผมติดตั้งไฟร์วอลล์ที่อนุญาตให้ใช้งานหลักๆ ได้แค่ “เว็บ” กับ “ssh” อย่างเช่น ผมไม่สามารถอัพเดตข้อมูลแพคเกจของ MacPorts ได้ เพราะว่ามันใช้วิธี rsync ผ่านพอร์ต 783 ที่ไม่ได้รับอนุญาต ครั้นจะไปขอให้เขาเปิดพอร์ตเพิ่มก็ดูกระไรอยู่ ส่วนใหญ่ผมจึงมักจะอัพเดตข้อมูลแพคเกจที่บ้านก่อนมาทำงาน
จริงๆ แล้ว ถ้าหากเรามีเซิร์ฟเวอร์ที่ใช้งาน ssh ได้อยู่ภายนอก และเซิร์ฟเวอร์เครื่องนั้นไม่มีไฟร์วอลล์ เราจะสามารถใช้วิธี ssh tunneling เพื่อติดต่อจากเครื่องของเราผ่านเซิร์ฟเวอร์ออกไปโลกภายนอกได้
$ ssh xxx.myserver.net -L 1783:rsync.somewhere.com:783
จะเป็นการติดต่อผ่าน ssh ไปยังเครื่อง xxx.myserver.net ตัวเลือก -L ใช้กำหนด ssh tunneling โดยโปรแกรม ssh จะจับข้อมูลที่ส่งไปยังพอร์ท 1783 ของเครื่องเราทั้งหมด ส่งต่อผ่านไปยังเครื่อง xxx.myserver.net และส่งต่อไปยังพอร์ต 783 ของเครื่อง rsync.somewhere.com ทำให้เราสามารถใช้งานเครื่อง rsync.somewhere.com ที่อยู่ข้างนอกได้ โดย ssh ทำตัวเสมือนเป็นอุโมงค์ให้ข้อมูลของเราลอดผ่านไฟร์วอลล์ออกไป
ในทำนองเดียวกัน ผมก็มักจะใช้ ssh tunneling เพื่อต่อเข้ามาใช้งานเน็ตเวิร์คภายในหน่วยงาน เวลาผมอยู่ข้างนอก อย่างเช่น ถ้าผมอยากจะโหลดเปเปอร์จากฐานข้อมูลที่สถาบันเป็นสมาชิก ซึ่งปรกติเขาจะตรวจสอบบุคคลด้วยไอพีแอดเดรส เวลาผมอยู่บ้านผมก็จะแค่ ssh เข้ามาที่เซิร์ฟเวอร์ภายในสถาบันก่อนแล้ว โดยกำหนดให้ forward ข้อมูลไปยังเครื่อง proxy ที่สามารถใช้งานได้ จากนั้นผมก็แค่เซ็ต proxy บนเครื่องผมให้เป็น localhost และใช้พอร์ตที่กำหนด ก็จะดูเหมือนว่าผมใช้งานจากภายในหน่วยงาน ผมสามารถเข้าไปใช้งานฐานข้อมูลได้ตามปกติ
$ ssh xxx.myinternal.net -L 8080:proxy.myinternal.net:8080
โปรแกรม ssh ส่วนใหญ่จะสนับสนุน tunneling หรือบางทีเรียกว่า port forwarding อย่างเช่น บน Windows คนที่ใช้ putty ก็จะมีตัวเลือกให้กำหนดพอร์ตต้นทางและปลายทางได้ ดังรูป
วันนี้คิดถึงอะไรหลายๆ อย่างวนไปวนมา แล้วก็นึกถึงเพลง 世界に一つだけの花 (ดอกไม้ชนิดเดียวในโลก) ของ SMAP ที่มีเนื้อหาดี เปรียบเทียบมนุษย์แต่ละคนเป็นเหมือนดอกไม้
それなのに僕ら人間は どうしてこうも比べたがる?
ทำไมพวกเรามนุษย์ทั้งหลายจึงอยากเปรียบเทียบกัน?
一人一人違うのにその中で 一番になりたがる?
อยากจะเป็นที่หนึ่งในบรรดาผู้คนที่แตกต่างกันหรือ?
そうさ僕らは
ที่จริงแล้ว เราแต่ละคนก็เป็นเหมือน
世界に一つだけの花
ดอกไม้ชนิดเดียวในโลกนี้
一人一人違う種を持つ
แต่ละคนมีเมล็ดพันธุ์ที่แตกต่างกันอยู่
その花を咲かせることだけに
การจะทำให้เมล็ดนั้นกลายเป็นดอกไม้ที่เบ่งบานได้
一生懸命になればいい
ด้วยพยายามของตัวเองอย่างเต็มที่ก็พอแล้ว
หลังจากสอนหนังสือมาสามปี ผมรู้สึกว่านักเรียนส่วนใหญ่ (ไม่ทั้งหมดหรอก แต่ว่าเยอะ) สนใจแค่คะแนนและเกรด ทำให้อาจารย์หลายๆ คน (รวมทั้งตัวผมด้วย) พยายามล่อนักเรียนด้วยการให้คะแนนไปซะทุกอย่าง มีนักเรียนไม่เยอะที่ผมรู้สึกว่าสนใจจริงๆ ในเนื้อหาที่กำลังเรียนอยู่ หรือพยายามเรียนรู้สิ่งต่างๆ เพิ่มเติมด้วยตัวเอง จริงๆ แล้วเกรดหรือคะแนน มันไม่ได้มีผลมากนักหรอกในโลกภายนอกมหาวิทยาลัย อาจจะจริงอยู่ที่เขาจะดูเกรดเวลารับเข้าทำงานหรือเรียนต่อ แต่หลังจากนั้นเมล็ดพันธุ์หรือต้นกล้าในแต่ละคนต่างหาก ที่จะเป็นส่วนสำคัญทำให้แต่ละคนกลายเป็นดอกไม้ที่สวยงาม และประสบความสำเร็จ จึงอยากให้ทุกคนสนใจที่จะบ่มเพาะตัวเองให้พร้อมที่จะออกไปเป็นดอกไม้ในโลกภายนอก
รู้สึกว่าวันนี้จะเขียนจริงจังไปแฮะ จริงๆ ก็แค่อยากแนะนำเพลงเท่านั้นแหละ อ้อ…ถ้าอยากอ่านคำแปลแบบเพราะๆ ก็ไปดูได้ที่ http://www.iknow.co.jp/user/delphine_bell/journal/2008/3/8/25745 อ่านแล้วกินใจกว่าที่ผมแปลข้างบนเยอะ ความสามารถในการแต่งประโยคของผมมีแค่นี้แหละ
ขอพูดถึงคำสั่ง unix ต่ออีกอันหนึ่งละกัน เนื่องจากเมื่อวานพยายามเขียน script เพื่อสร้าง account แบบเยอะๆ โดยใช้ข้อมูลในไฟล์รายชื่อนักเรียน เพราะว่ามีนักเรียนอยู่ 120 กว่าคน ถ้าให้สร้างด้วยมืออาจจะหมดแรงก่อนได้ ปัญหาเกิดขึ้นตอนกำหนด password ที่แม้ว่าจะมีโปรแกรม pwgen สำหรับสร้าง password ให้โดยอัตโนมัติแล้วก็ตาม แต่โปรแกรม adduser ที่ใช้บน Ubuntu ไม่ยอมให้กำหนด password ไว้เป็น option จึงต้องหาวิธีอื่นๆ ซึ่งก็มีหลายวิธี เช่น เปลี่ยนไปใช้ useradd (ชื่อคล้ายกัน สับสนดีแท้) แทนเนื่องจากกำหนดรายละเอียดต่างๆ ได้เยอะ แต่ก็มีปัญหาที่จะต้องตามไปกำหนดเงื่อนไขต่างๆ ยุ่งยากพอสมควรในขณะที่ adduser มีอีกคนกำหนดค่าต่างๆ ไว้ให้แล้ว อีกวิธีหนึ่งก็จะต้องไปแก้ไฟล์ shadow เพื่อแก้ข้อมูลเอาเอง ซึ่งไม่อยากทำเท่าไหร่ กลัวผิดแล้วมีปัญหา
สุดท้ายมีคนแถวนี้แนะนำให้ใช้โปรแกรม expect ซึ่งสามารถจำลองการทำงานของโปรแกรมที่ต้องมีการตอบโต้กับผู้ใช้ ให้เราสามารถส่งค่าได้เหมือนกับสั่งงาน โดย expect นี้จะใช้ regular expression เพื่อเทียบข้อความที่โปรแกรมแสดงออกมา แล้วจึงสามารถใช้คำสั่ง send เพื่อส่งข้อความหรืออินพุตกลับไปได้ เช่น
#!/usr/bin/expect -f
spawn passwd [lindex $argv 0]
set password [lindex $argv 1]
expect "password:"
send "$password\r"
expect "password:"
send "$password\r"
expect eof
จากโปรแกรม คำสั่ง expect เป็นการกำหนดให้รอจนกระทั่งมีข้อความที่กำหนดแสดงขึ้นมา ส่วนคำสั่ง send ก็จะเป็นส่งข้อมูลซึ่งก็คือ password ของเราไปให้โปรแกรม ที่เรียกมาทำงานโดยใช้คำสั่ง spawn ทั้งหมดนี้ไม่ได้เขียนเองหรอก ดูจากที่อ้างอิงได้
อ้างอิง: http://floppsie.comp.glam.ac.uk/Glamorgan/gaius/scripting/5.html