6

私は通常、コンピューターに (さまざまな画面セッションに分散して) 長時間実行される zsh プロセスを多数持っていますが、しばらく使用されていないシェルは交換される傾向があります。このようなスワップアウトされたシェルに切り替えて Enter キーを押すと (空のプロンプトで)、シェルが応答して新しいプロンプトが表示されるまでに数秒かかります (ただし、その後は完全に機能し始めます)。

煩わしさを軽減するために、unswap PID(すでに応答している別のシェルから)呼び出してシェルスワップインを強制できるコマンド(たとえば)が必要です。

これを達成する方法についてのアイデアはありますか?

PSシステムに任意のプロセスでスワップを要求するコマンドを探すことから始めましたが、そのようなものは見つからなかったので、これは不可能だと思いました。zshこれは私が本当に興味を持っているケースであり、その特定のケースの解決策があることを望んでいるので、私はここで私の質問を に集中させました. (zshだけでなく)どのプロセスでも機能するより一般的な方法があれば、それも大歓迎です。

PPS最初に、シェル内でトラップ関数を使用することを考えました。これにより、シェルがスワップインするのに十分なアクティビティ(何でも)が実行されました。WINCHただし、シグナルでこれを試してみたところ、機能しないことがわかりました。(スワップアウトされたプロセスにシグナルが配信されていない可能性がありますか?シグナルはありますか?)


編集:私の典型的なケースでは、zsh実行中のプロセスの束があり、ブラウザを開いたままにしておくと (複数の Gmail、Facebook などのタブがあり)、ブラウザが使用可能なすべての RAM を占有し、圧迫します。それ以外はすべてスワップします。デスクトップがしばらく反応しなくなりますが、すぐに治ります。ただし、screen セッションに再接続するときは、各シェルを手動で起動する必要があります (それらを調べて、各シェルで Enter キーを押します)。

4

3 に答える 3

2

この回答で述べたようにgdb、プロセスのメモリをダンプしてスワップを解除するために使用できます。

また、コマンド ラインから直接これを行うスクリプトがあることもわかりました (最初に開始してから、その中で追加のコマンドを実行する必要はありません)。gcoregdb

gcore -o /tmp/SOMETHING PID1 PID2 PID3

PID1、PID2、および PID3 のプログラムのスワップが解除され、その内容がファイルなどにダンプされ/tmp/SOMETHING.PID1ます/tmp/SOMETHING.PID2

この回答には、同じことを行う Python スクリプトもあります。ただし、確かに – この質問への回答として – はるかに良い方法で、このスクリプトは、副作用にのみ関心があるため、STDOUT地獄に直接パイプできるダンプを出力するため (ええと、もちろん )/dev/nullとにかくスワップ解除の。

于 2013-09-06T08:05:32.087 に答える