Pythonでプロセスの名前を変更する

Pythonでマルチプロセスアプリケーションを作成する場合、個々のプロセスの動作を監視するための、ある種の最大限シンプルな方法が必要です。 10ページの詳細な分析レポートではなく、各プロセスの正常性と作業に関する最小限の情報(現在何をしているか、システムにどのくらいの負荷をかけているか、どのくらいのメモリを消費しているかなど) nginxまたはpostgresが自分自身についてどのように話すかについて:topまたはpsを一目見れば、各プロセスが何をどのように行うかを理解するのに十分です。

Linux(たとえば、DebianやFC)上のPythonでこれをどのように行うことができるかを理解することは残っています。





ソリューションを探しています:

残念ながら、「一挙に」問題を解決することはできませんでした。既成のソリューションはありませんでした。 私にとっては奇妙なことでした。そのような開発された言語、巨大なコミュニティ、プロセス名前変更のスペースへの成功した起動に関する最初の報告は、ほぼ2003年のものです。 そして5年後も、まだすぐれた解決策はありません。 死んだプロジェクト、レシピ、コードの一部へのリンクがありました。 さらに、私には常に双子の兄弟であるように思われたtopとpsは、表示するプロセスの名前をどこで取得するかについて異なる見解を持っていることが判明しました。 そのため、良い方法で、それぞれの名前を個別に変更する必要があります。



ソースの分析により、プロセスの名前を正常に変更するには、2つのことを行う必要があることがわかりました。名前をargv [0]に置き換え、新しい名前でシステムコールを作成します。 Cでこれを行うことは2バイトを送信するようなものですが、Pythonではアスタリスクの付いたタスクになります。 幸いなことに、PythonはCとうまく統合されているため、ライブラリを呼び出す必要があります。 残念ながら、dlのような標準ツールではうまくいきませんでした。このライブラリは32ビットdebianのみの標準であり、64ビットでは拡張パッケージでもありません。 susyにはこのようなパッケージがありましたが、申し訳ありませんが、システム上の異種のパッケージからひどいポリッジを作りたくありません。 代替のctypes lib(その名前はそれ自身を物語っています)も悲しいかな、助けにはなりませんでした。 エキゾチックなことから、PyInlineのソリューションに言及することもできます-このモジュールのロードを伴うプログラムの実行中に、CコードをPythonモジュールにコンパイルします。 しかし、このような「解釈されたC」からは、髪の毛が逆立ちします。 そして、結局のところ、無駄ではありませんでした-プログラムは病気になりました。 約半分のケースで、打ち上げはトレースバックでなくても落下し、すぐに皮質に落ちてスタックのが3つの画面に落ちました。 インライン自体ではなかったのかもしれません-膨大なプログラムでは常に競合する可能性のあるモジュールのカクテルがありますが、人生ではこれらの競合を解決するよりも興味深い重要なタスクがあります。



解決策:

結局、私はこれらのSコードにいちゃつくことにうんざりしていました。 Syで主要な作業部分を記述する必要があることが既に明らかな場合、これらの松葉杖とガスケット! すぐに正直なCコードを作成し、Pythonへのインターフェイスを提供すること、つまり、そのようなモジュールを作成することをお勧めします。



当時、私はこれらすべてがどのように行われるかさえ想像していませんでした。 幸いなことに、優れた言語アーキテクチャと詳細なドキュメントにより、このタスクは簡単になりました。



ありがとう、グイド! ファンの軍隊はどこに参加できますか? :)



最終的に、すべてがシンプルで美しいものになりました。ソースコードは正確に1ページ+アセンブリ用の短いMakefileです。 コンパイル後、サイズが約7Kのso-fileを取得します。



使用する

それと同じくらい簡単:
>>> procnameのインポート

>>> procname.getprocname()#現在のプロセス名を取得

「python」

>>> procname.setprocname( 'Bla-bla test')#新しいプロセス名を与える-topとpsをチェックイン!

#再びプロセス名が表示されます

>>> procname.getprocname()

「ブラブラテスト」




どこで入手し、組み立てる方法は?

私はGoogleコードにプロジェクトを投稿しました: code.google.com/p/procname

ソースを一時フォルダーにダウンロードしてから、通常どおり:

$ tar -zxf procname-XX.tar.gz

$ cd procname-XX

$ make


その後、現在のフォルダーにprocname.soファイルがあるはずです -それをプログラムフォルダーにコピーするか、任意のプログラムで使用できるようにする場合は、 / usr / lib / python2.5 / site-packagesフォルダーにコピーします

ファイルの代わりにエラーが表示された場合は、必要なものがすべて揃っているかどうかを確認してください。 ビルドするには、python-develパッケージ、make(gnuであるパッケージ)、そしてもちろんgccコンパイラが必要です:)

ほとんどの場合、問題はPython.hおよびsys / prctl.hヘッダーファイルの誤った場所にあります。 Makefileでフォルダーを検索および指定して検索します。 助けにならなければ、ここに書いて、一緒に理解しましょう。



免責事項:

そのような場合にはいつものように、このライブラリは「現状のまま」提供されます。 何も保証できません。 それがあなたのために働くか、正しく働くか、少なくとも組み立てられます。 また、サーバーがラージアンドロンコライダーにならず、半径100マイル以内のすべてを吸収しないという事実もあります。

私自身で、libがDebian(32ビットおよび64ビット)、FedoraCore(すべて2.6カーネルカーネル)でテストされていることを追加します。 「戦闘」サーバーでほぼ1か月間libaを使用しています。



他の* nixはどうですか?

他のUNIXでは、編成が少し異なります。 特に、 FreeBSDには、psで表示するプロセスの名前を指定できる特別なsetproctitleシステムコールがあります。 ちなみに、同じ場所で、その非標準が示されています。 ただし、 AltLinuxにはアナログがあります。 Debianでは、状況は理解できませんが、AltovのDmitryが彼のlibを移植したようですが、etchとlennyで見つけることができませんでした。



これを実際に使用するにはどうすればよいですか?

私のプログラムでは、各プロセスは一度に1つのタスクを処理します。 起動時に最初に名前が変更され、その名前にタスク番号やステータスなど、「 ICd:7562-starting 」のような名前が付けられます。 さらに、重要なイベント(たとえば、ステータスの変更、新しいタスク、OSからのシグナルの受信など)ごとに、名前が再び変更されます。 その結果、各タスクの処理の進行状況を確認でき、リソース消費の異常、処理の減速、繰り返しなどをタイムリーに検出できます。 時間内にそれらに応答します。



おわりに

プロセスを監視することは楽しい経験になりました-あなたはトップに立ち、椅子に身を乗り出し、あなたの「ピトス」がデータに喜んで食い込むのを見てください:)



一般に、私の意見では、このようなユニバーサルPythonライブラリを作成して、Linuxのプロセス名やフリーチップを、実装方法に縛られることなく自由に操作できるようにするのは正しいでしょう。 または多分Windowsでも!




コメント、提案、アイデアに喜んでいます。



PSこの記事をHabréでの出版に向けて準備してくれたすべての人に感謝します。 あなたがいなければ、それは不可能でしょう!



All Articles