Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

`top`と`ps`で表示されるRubyスクリプトのプロセス名を変更する方法

LinuxやOS Xでプログラムを実行すると、そのプログラムは必ず「プロセス」として動作します。そして、すべてのプロセスには名前が付けられています。この名前は、pstophtopといったコマンドを実行したときに目にするものです。

`top`と`ps`で表示されるRubyスクリプトのプロセス名を変更する方法 htopでは、右端の列にプロセス名が表示されます。

デフォルトのプロセス名の課題

デフォルトでは、プロセス名は実行中のプログラムを含む実行ファイルの名前から自動的に決まります。多くの実行ファイルにとってこれは理にかなっています。たとえば「less」コマンドを実行すれば、そのプロセス名が「less」になるのは自然なことです。

しかし、コマンドラインからRubyスクリプトを実行する場合、デフォルトのプロセス名はあまり役に立ちません。次の例では、5秒間スリープするだけのRubyスクリプトを実行しています。別のターミナルウィンドウでpsを実行すると、このスクリプトのプロセス名が「ruby sleep_5_seconds.rb」になっているのがわかります。さらにコマンドライン引数を追加すると、それらもプロセス名に含まれてしまいます。これでは、プロセスを名前で参照するのが難しくなります。

`top`と`ps`で表示されるRubyスクリプトのプロセス名を変更する方法 Rubyコマンド全体がそのままプロセス名として表示される

プロセス名を変更する方法

幸いなことに、Rubyでは現在のプロセス名を簡単に変更できます。以下は更新したスクリプトです。プロセス名を「sleeper」に設定するようにしました。

# `Process.setproctitle()` は Ruby 2.1 以降で利用可能
# それ以前のバージョンのRubyでは以下を使用できます
#   $PROGRAM_NAME = "sleeper"
# または
#   $0 = "sleeper"

Process.setproctitle("sleeper")
sleep 5

このプログラムを実行してpsで確認すると、プロセス名が「sleeper」と表示されます。

`top`と`ps`で表示されるRubyスクリプトのプロセス名を変更する方法 Rubyでプロセスタイトルを変更すると、pstopの出力も変わる

さらに便利なことに、これでプロセスを名前で簡単に参照できるようになりました。たとえば、スリープ中のプロセスを待ちきれなくなった場合は、killall sleeperコマンドで終了できます。

`top`と`ps`で表示されるRubyスクリプトのプロセス名を変更する方法 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

これは4つの子プロセスを持つUnicornインスタンスです。先ほどの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

実は、これはRackミドルウェアを使えばかなり簡単に実現できます。以下はその実装例です。

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

すべてのWebリクエストごとにプロセスタイトルを設定することによるパフォーマンスへの影響については検証していません。その点は割り引いて読んでいただきたいのですが、それでもかなりクールなアイデアだと思います。

このアイデアのより高度な実装——実際に本番環境で使われているもの——を見てみたい方は、Thomas Varaneckas氏による「Overriding Unicorn Worker Process Names」に関する素晴らしいブログ記事をぜひチェックしてみてください。

  1. iPhoneの名前を変更する方法と、変更すべき理由を徹底解説

    新しいiPhoneには、デフォルトであなたの本名が含まれた名前が自動的に付けられています。Apple IDの登録や初期設定時にペンネームなどを使用していない限り、iPhoneの名前にも本名がそのまま表示されることになります。この記事では、iPhoneの名前を変更する具体的な手順を詳しく解説します。さらに、iPhoneに接続したBluetoothアクセサリの名前を変更する方法や、画面が正常に動作しない場合でも名前を変更できるテクニックもご紹介します。iPhoneの名前を変更すべき理由iPhoneのデフォルト名には本名が含まれているため、AirDrop経由でプライバシーが漏洩するリスクがあります。

  2. Facebookで名前を変更する方法【PC・スマホアプリ対応】

    Facebookのプロフィール名を更新・編集したいと思ったことはありませんか? 結婚などで姓が変わった方も、気分転換に名前を変えたい方も、この記事ではFacebookでプロフィール名を変更する手順をわかりやすく解説します。 Facebookは、ユーザー同士のコミュニケーション、写真の共有、意見の投稿、動画の視聴、ライブチャットなどを楽しめる世界的に人気のSNSです。個人利用だけでなく、ビジネスの宣伝に活用している人も多く、そうした用途に合わせて名前を変更したいケースもあります。 Facebookの名前変更ポリシーとは 名前の変更手順に入る前に、まずFacebookの名前に関するポリシーを確認し