ทุกครั้งที่คุณรันโปรแกรมบน Linux หรือ macOS โปรแกรมนั้นจะทำงานภายใน "process" (กระบวนการ) และทุก process จะมีชื่อของตัวเอง ชื่อนี้คือสิ่งที่คุณเห็นเมื่อรันคำสั่งเช่น ps หรือ top หรือ htop
htop แสดงชื่อ process ในคอลัมน์ขวาสุด
ชื่อ Process เริ่มต้นอาจไม่ค่อยช่วยได้
โดยค่าเริ่มต้น ชื่อของ process จะมาจากชื่อไฟล์ executable ที่มีโปรแกรมที่คุณกำลังรันอยู่ วิธีนี้ใช้ได้ดีกับ executable ส่วนใหญ่ เพราะเป็นเหตุผลที่สมเหตุสมผลที่เวลาคุณรัน "less" ชื่อ process ก็จะเป็น "less" เช่นกัน
แต่มันไม่ค่อยช่วยได้เท่าไหร่เมื่อคุณมี Ruby script ที่รันจาก command line ในตัวอย่างด้านล่าง ผมกำลังรัน ruby script ที่ sleep 5 วินาที ถ้าผมรัน "ps" พร้อมกันใน terminal อีกหน้าต่าง จะเห็นว่าชื่อ process ของ sleeper คือ "ruby sleep_5_seconds.rb" ถ้าผมเพิ่ม command line arguments เข้าไป มันจะแสดงอยู่ในชื่อ process ด้วย ทำให้ยากที่จะอ้างอิง process โดยชื่อ
คำสั่ง ruby ทั้งหมดถูกแสดงเป็นชื่อ process
วิธีเปลี่ยนชื่อ Process
โชคดีที่คุณสามารถเปลี่ยนชื่อ process ปัจจุบันได้อย่างง่ายดายด้วย Ruby นี่คือ script ที่อัปเดตแล้ว ตอนนี้มันตั้งชื่อ process เป็น "sleeper"
# `Process.setproctitle()` ใช้ได้ใน Ruby >= 2.1 # สำหรับ Ruby เวอร์ชันก่อนหน้า สามารถใช้ # $PROGRAM_NAME = "sleeper" # หรือ # $0 = "sleeper" Process.setproctitle("sleeper") sleep 5
ตอนนี้เวลาเรารันโปรแกรมและใช้ ps แสดง title จะได้ "sleeper"
การเปลี่ยน process title ใน Ruby เปลี่ยน output ของ ps และ top
แต่มันดีกว่านั้น เราสามารถอ้างอิง process โดยชื่อได้ง่ายขึ้น สมมติผมเบื่อรอ sleeper sleep ผมสามารถ kill มันได้ด้วยคำสั่ง killall sleeper
สามารถใช้คำสั่ง killall เพื่อ terminate process โดยชื่อ
แสดงสถานะ Server ผ่านชื่อ Process
การใช้งานที่น่าสนใจหนึ่งของความสามารถเปลี่ยน process title คือการแสดงข้อมูลสถานะสำหรับ process ที่รันนาน หากเคยรัน Unicorn ควรจะคุ้นเคยกับรูปแบบนี้:
\-+= 27185 deply unicorn master -c simple_unicorn_config.rb -l0.0.0.0:8080 |--- 27210 deply unicorn worker[0] -c simple_unicorn_config.rb -l0.0.0.0:8080 |--- 27211 deply unicorn worker[1] -c simple_unicorn_config.rb -l0.0.0.0:8080 |--- 27212 deply unicorn worker[2] -c simple_unicorn_config.rb -l0.0.0.0:8080 |--- 27213 deply unicorn worker[3] -c simple_unicorn_config.rb -l0.0.0.0:8080
นี่คือ instance ของ Unicorn ที่มี child process 4 ตัว เหมือนกับตัวอย่าง sleep_5_seconds.rb ชื่อ process แค่แสดงคำสั่งที่ใช้ launch process
อาจจะมีประโยชน์ถ้า status lines แสดงว่า worker busy หรือ idle เช่นนี้:
\-+= 27185 deply unicorn master -c simple_unicorn_config.rb -l0.0.0.0:8080 |--- 27210 deply unicorn worker[0] -c simple_unicorn_config.rb -l0.0.0.0:8080 BUSY |--- 27211 deply unicorn worker[1] -c simple_unicorn_config.rb -l0.0.0.0:8080 |--- 27212 deply unicorn worker[2] -c simple_unicorn_config.rb -l0.0.0.0:8080 |--- 27213 deply unicorn worker[3] -c simple_unicorn_config.rb -l0.0.0.0:8080 BUSY
คุณสามารถทำได้ง่ายๆ ด้วย Rack middleware นี่คือตัวอย่าง:
class UpdateProcessTitle def initialize(app) @app = app end def call(env) title = $0 $0 = $0 + " BUSY" status, headers, body = @app.call(env) $0 = title [status, headers, body] end end
ผมไม่แน่ใจเรื่อง performance implications ของการตั้ง process title ทุก web request ดังนั้นขอให้พิจารณาด้วยความระมัดระวัง แต่มันยังเป็นไอเดียที่ค่อนข้าง cool อยู่ดี
ถ้าอยากดู implementation ที่ advanced กว่า ซึ่งใช้ใน production จริง ดูได้จาก blog post ของ Thomas Varaneckas เรื่อง Overriding Unicorn Worker Process Names