web-dev-qa-db-ja.com

SIGSTOPまたはSIGCONTシグナルをグラフィカルに送信する(xkillと同様)

質問

プロセスによって生成されたグラフィカルウィンドウをクリックしてプロセスにSIGSTOP(プロセスを一時停止する)またはSIGCONT(プロセスを再開する)を送信するツール/スクリプトを知っていますか?

一部のコンテキスト

ウィンドウをクリックするとプログラムを強制終了するxkillというツールが既にありますが、特定のシグナルを送信するオプションはありません。 killなどのやや関連するコマンドラインツールにはこのオプションがあるため、これは残念です。

通常、対応するプロセス名を手動で取得し、killpkill、またはkillallなどのツールを使用して、コマンドラインでこれを行いますが、これをグラフィカルに、 xkillツールでウィンドウをクリックするのと同様の方法。

アプリケーション

CPUが過度に「ストレス」を受けている場合、それらを終了せずに保存できないデータを失うことなく(たとえば、長い計算の部分的な結果)、重いプロセスをグラフィカルに一時停止するには、このようなツールが非常に便利だと思います。

2
Kubuntuer82

xdotoolを使用して、ユーザーがウィンドウをクリックしてそのプロセスIDを取得できるようにすることができます。次に、killを使用して、たとえばSTOPまたはCONTはそのプロセスに信号を送り、そのように凍結/解凍します。

最初に、xdotoolをインストールする必要があります。プリインストールされていないためです。

Sudo apt install xdotool

次に、特定のウィンドウを所有するプロセスのPIDを取得するコマンドは、マウスでクリックして選択できます。

xdotool selectwindow getwindowpid

これにより、数値のプロセスIDが出力されます。 kill -STOPまたはkill -CONTへの引数として指定して使用すると、上記のプロセスを一時停止して続行できます。これは、クリックしたウィンドウのプロセスを5秒間一時停止する以下のこの小さなスクリプトのように、変数にPIDを保存することで簡素化できます。

#!/bin/bash
wpid="$(xdotool selectwindow getwindowpid)"
kill -STOP "$wpid"
sleep 5
kill -CONT "$wpid"

これで、このスクリプトをコンピューターに保存できました。キーボードショートカットにバインドします。

注:man xdotoolgetwindowpidサブコマンドについて説明します。

「これには、ウィンドウを所有するアプリケーションの努力が必要であり、すべてのウィンドウで機能しない場合があります。」

言い換えると、一部のアプリケーションで意図したとおりに動作しないか、少なくとも正確に動作しない可能性があります。
複数のウィンドウが同じ対応するプロセスIDを持っている場合もあります。すべてのgnome-terminalインスタンスは同じ親によって所有されています。その場合、コマンドはそれらのすべてを凍結しますが、これは意図されていない可能性があります。

2
Byte Commander

Byte Commander♦の回答の改善:

そのためのxdtoolベースのスクリプトがあります: https://github.com/RegisterFault/clickstop

クリックされたアプリケーションのプロセスツリーにSIGSTOPおよびSIGCONTシグナルを送信するためにxdotoolを使用するBashスクリプト

利点は、プロセスツリー全体を中断することです。これは、たとえばマルチプロセスchromeまたはfirefoxを中断するために必要です。

1
kotofos