Bất cứ khi nào bạn chạy một chương trình trên linux hoặc OSX, nó sẽ chạy bên trong một tiến trình. Và mọi quy trình đều có tên. Tên là những gì bạn thấy khi chạy một lệnh như ps hoặc top hoặc htop.
htop hiển thị tên quá trình ở cột ngoài cùng bên phải.
Tên quy trình mặc định có thể hút
Theo mặc định, tên của tiến trình được lấy từ tên tệp thực thi có chứa chương trình bạn đang chạy. Điều này hoạt động tốt cho hầu hết các tệp thực thi. Xét cho cùng, có nghĩa là khi bạn chạy "less", thì tên tiến trình của nó phải là "less".
Nhưng các tên tiến trình mặc định ít hữu ích hơn khi bạn có một tập lệnh Ruby mà bạn đang chạy từ dòng lệnh. Trong ví dụ dưới đây, tôi đang chạy một tập lệnh ruby ngủ trong năm giây. Nếu tôi đồng thời chạy "ps" trong một cửa sổ đầu cuối khác, tôi thấy rằng tên quy trình cho trình ngủ của tôi là "ruby sleep_5_seconds.rb". Nếu tôi thêm các đối số dòng lệnh, chúng cũng sẽ hiển thị trong tên tiến trình. Điều này sẽ gây khó khăn khi tham khảo quy trình theo tên.
Lệnh ruby đầy đủ được liệt kê dưới dạng tên quá trình
Cách Thay đổi Tên Quy trình
May mắn thay, bạn có thể thay đổi tên của tiến trình hiện tại một cách dễ dàng với Ruby. Đây là kịch bản cập nhật của chúng tôi. Bây giờ nó đặt tên quy trình của nó thành "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
Bây giờ, khi chúng tôi chạy chương trình và sử dụng ps để hiển thị tiêu đề của nó, chúng tôi nhận được "sleeper"
Thay đổi tiêu đề quy trình trong Ruby sẽ thay đổi đầu ra của ps
và top
Nhưng tốt hơn nữa, bây giờ chúng ta có thể dễ dàng tham khảo quy trình theo tên. Giả sử tôi cảm thấy mệt mỏi khi chờ người ngủ. Tôi có thể giết nó bằng lệnh killall sleeper
.
Bạn có thể sử dụng killall
lệnh kết thúc các quy trình bằng tên
Hiển thị Trạng thái Máy chủ qua Tên Quy trình
Một công dụng thú vị của khả năng thay đổi tiêu đề quy trình mới của chúng tôi là hiển thị thông tin trạng thái cho các quy trình đang chạy lâu dài. Nếu bạn đã từng chạy Unicorn, điều này sẽ trông quen thuộc:
\-+= 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
Đó là một phiên bản của Unicorn với bốn quy trình con. Cũng giống như với ví dụ sleep_5_seconds.rb của chúng tôi, tên quy trình chỉ hiển thị các lệnh được sử dụng để khởi chạy quy trình.
Nó có thể hữu ích cho các dòng trạng thái hiển thị nếu nhân viên đang bận hoặc không hoạt động. Một cái gì đó như thế này:
\-+= 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
Bạn thực sự có thể làm điều này khá dễ dàng với phần mềm trung gian Rack. Dưới đây là một ví dụ về những gì có thể trông như thế này:
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
Tôi không có ý tưởng về các tác động hiệu suất của việc đặt tiêu đề quy trình trên mọi yêu cầu trang web. Vì vậy, hãy coi tất cả điều này với một hạt muối. Tuy nhiên, đó là một ý tưởng khá hay.
Nếu bạn muốn thấy cách triển khai nâng cao hơn của ý tưởng này - một ý tưởng thực sự đã được sử dụng trong quá trình sản xuất - hãy xem bài đăng trên blog tuyệt vời của Thomas Varaneckas về Ghi đè tên quy trình công nhân Unicorn.