Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

วิธีเปลี่ยนชื่อกระบวนการของสคริปต์ Ruby ตามที่แสดงโดย `top' และ `ps`

เมื่อใดก็ตามที่คุณเรียกใช้โปรแกรมบน linux หรือ OSX โปรแกรมจะทำงานภายในกระบวนการ และทุกกระบวนการมีชื่อ ชื่อคือสิ่งที่คุณจะเห็นเมื่อคุณเรียกใช้คำสั่งเช่น ps หรือ top หรือ htop

วิธีเปลี่ยนชื่อกระบวนการของสคริปต์ Ruby ตามที่แสดงโดย `top  และ `ps` htop แสดงชื่อกระบวนการในคอลัมน์ขวาสุด

ชื่อกระบวนการเริ่มต้นสามารถดูดได้

โดยค่าเริ่มต้น ชื่อของกระบวนการจะมาจากชื่อไฟล์ปฏิบัติการที่มีโปรแกรมที่คุณกำลังเรียกใช้อยู่ วิธีนี้ใช้ได้ผลดีสำหรับไฟล์ปฏิบัติการส่วนใหญ่ ท้ายที่สุดแล้ว เมื่อคุณเรียกใช้ "less" ชื่อกระบวนการควรเป็น "less"

แต่ชื่อกระบวนการเริ่มต้นจะมีประโยชน์น้อยกว่าเมื่อคุณมีสคริปต์ Ruby ที่คุณเรียกใช้จากบรรทัดคำสั่ง ในตัวอย่างด้านล่าง ฉันกำลังเรียกใช้สคริปต์ ruby ​​ที่สลีปเป็นเวลาห้าวินาที ถ้าฉันเรียกใช้ "ps" พร้อมกันในหน้าต่างเทอร์มินัลอื่น ฉันเห็นว่าชื่อกระบวนการสำหรับ sleeper ของฉันคือ "ruby sleep_5_seconds.rb" หากฉันต้องเพิ่มอาร์กิวเมนต์บรรทัดคำสั่ง อาร์กิวเมนต์เหล่านั้นจะแสดงในชื่อกระบวนการด้วย ซึ่งจะทำให้ยากต่อการอ้างถึงกระบวนการด้วยชื่อ

วิธีเปลี่ยนชื่อกระบวนการของสคริปต์ Ruby ตามที่แสดงโดย `top  และ `ps` คำสั่ง 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 ตามที่แสดงโดย `top  และ `ps` การเปลี่ยนชื่อกระบวนการใน Ruby จะเปลี่ยนผลลัพธ์ของ ps และ top

แต่ยิ่งไปกว่านั้น ตอนนี้ เราสามารถอ้างถึงกระบวนการโดยใช้ชื่อได้อย่างง่ายดาย สมมติว่าฉันเหนื่อยกับการรอคนนอนของฉันเข้านอน ฉันสามารถฆ่ามันได้โดยใช้คำสั่ง killall sleeper .

วิธีเปลี่ยนชื่อกระบวนการของสคริปต์ Ruby ตามที่แสดงโดย `top  และ `ps` คุณสามารถใช้ 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