เมื่อใดก็ตามที่คุณเรียกใช้โปรแกรมบน linux หรือ OSX โปรแกรมจะทำงานภายในกระบวนการ และทุกกระบวนการมีชื่อ ชื่อคือสิ่งที่คุณจะเห็นเมื่อคุณเรียกใช้คำสั่งเช่น ps หรือ top หรือ htop
htop แสดงชื่อกระบวนการในคอลัมน์ขวาสุด
ชื่อกระบวนการเริ่มต้นสามารถดูดได้
โดยค่าเริ่มต้น ชื่อของกระบวนการจะมาจากชื่อไฟล์ปฏิบัติการที่มีโปรแกรมที่คุณกำลังเรียกใช้อยู่ วิธีนี้ใช้ได้ผลดีสำหรับไฟล์ปฏิบัติการส่วนใหญ่ ท้ายที่สุดแล้ว เมื่อคุณเรียกใช้ "less" ชื่อกระบวนการควรเป็น "less"
แต่ชื่อกระบวนการเริ่มต้นจะมีประโยชน์น้อยกว่าเมื่อคุณมีสคริปต์ Ruby ที่คุณเรียกใช้จากบรรทัดคำสั่ง ในตัวอย่างด้านล่าง ฉันกำลังเรียกใช้สคริปต์ ruby ที่สลีปเป็นเวลาห้าวินาที ถ้าฉันเรียกใช้ "ps" พร้อมกันในหน้าต่างเทอร์มินัลอื่น ฉันเห็นว่าชื่อกระบวนการสำหรับ sleeper ของฉันคือ "ruby sleep_5_seconds.rb" หากฉันต้องเพิ่มอาร์กิวเมนต์บรรทัดคำสั่ง อาร์กิวเมนต์เหล่านั้นจะแสดงในชื่อกระบวนการด้วย ซึ่งจะทำให้ยากต่อการอ้างถึงกระบวนการด้วยชื่อ
คำสั่ง ruby แบบเต็มจะแสดงเป็นชื่อกระบวนการ
วิธีการเปลี่ยนชื่อกระบวนการ
โชคดีที่คุณสามารถเปลี่ยนชื่อของกระบวนการปัจจุบันได้อย่างง่ายดายด้วย Ruby นี่คือสคริปต์ที่อัปเดตของเรา ตอนนี้ตั้งชื่อกระบวนการเป็น "sleeper"
# `Process.setproctitle()` is in Ruby >= 2.1
# For earlier versions of Ruby, you can use
# $PROGRAM_NAME = "sleeper"
# or
# $0 = "sleeper"
Process.setproctitle("sleeper")
sleep 5
เมื่อเรารันโปรแกรมและใช้ ps เพื่อแสดงชื่อ เราจะได้ "sleeper"
การเปลี่ยนชื่อกระบวนการใน Ruby จะเปลี่ยนผลลัพธ์ของ
ps
และ top
แต่ยิ่งไปกว่านั้น ตอนนี้ เราสามารถอ้างถึงกระบวนการโดยใช้ชื่อได้อย่างง่ายดาย สมมติว่าฉันเหนื่อยกับการรอคนนอนของฉันเข้านอน ฉันสามารถฆ่ามันได้โดยใช้คำสั่ง killall sleeper
.
คุณสามารถใช้
killall
คำสั่งให้ยุติกระบวนการด้วยชื่อ
การแสดงสถานะเซิร์ฟเวอร์ผ่านชื่อกระบวนการ
การใช้ความสามารถใหม่ของเราในการเปลี่ยนชื่อกระบวนการที่น่าสนใจอย่างหนึ่งคือการแสดงข้อมูลสถานะสำหรับกระบวนการที่ทำงานเป็นเวลานาน หากคุณเคยวิ่ง 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
เป็นตัวอย่างของยูนิคอร์นที่มีกระบวนการย่อยสี่ขั้นตอน เช่นเดียวกับตัวอย่าง sleep_5_seconds.rb ของเรา ชื่อกระบวนการจะแสดงคำสั่งที่ใช้ในการเริ่มต้นกระบวนการ
อาจเป็นประโยชน์สำหรับการแสดงบรรทัดสถานะหากผู้ปฏิบัติงานไม่ว่างหรือไม่ทำงาน บางสิ่งเช่นนี้:
\-+= 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
คุณสามารถทำสิ่งนี้ได้อย่างง่ายดายด้วยมิดเดิลแวร์แบบแร็ค นี่คือตัวอย่างที่อาจมีลักษณะดังนี้:
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
ฉันไม่รู้ถึงผลกระทบของการตั้งชื่อกระบวนการในทุกคำขอของหน้าเว็บ ดังนั้นจงเอาทั้งหมดนี้ด้วยเม็ดเกลือ แต่ก็ยังเป็นความคิดที่เจ๋งมาก
หากคุณต้องการเห็นการนำแนวคิดนี้ไปใช้ในขั้นสูงยิ่งขึ้น ซึ่งเป็นแนวคิดที่ใช้จริงในการผลิต โปรดอ่านบล็อกโพสต์ที่ยอดเยี่ยมของ Thomas Varaneckas เกี่ยวกับ Overriding Unicorn Worker Process Names