pkillがrofiで機能しないのはなぜですか?

pkillがrofiで機能しないのはなぜですか?

rofiキーバインディングを使用してアプリケーションランチャーを切り替えたいと思います。シェルスクリプトを作成しましたが、

#!/bin/bash

rofi -dpi 1 -modi drun -show drun -show-icons

そしてこれをキーにバインドします。これはうまくいきますが、再実行しないように切り替えるには、次のことを試しました。

pkill -0 rofi || rofi -dpi 1 -modi drun -show drun -show-icons

これはrofiを起動しません。私はそれをテストし、pkill emacs || emacs実際にemacsを切り替えることができます。誰かがrofiを修正する方法を教えてもらえますか?そしてパラメータ「-0」は何をしますか?ドキュメントに見つかりません。

私が見つけたこれ

私はこの問題を解決するのにかなり長い時間を費やし、rofiがそのpidを保存することに気づきました。設定を使用してpidファイルにアクセスし、必要なすべての情報にアクセスできます。しかし、興味深い内容を扱う前に安全について言及する価値があります。ランアウェイスクリプトの生成を防ぐために、何らかの方法でプロセス数を制限することは非常に良い考えです。経験上、他のttyに切り替えてすべてを終了するのに十分なメモリを確保するのに30分かかります。

if [[ 10 -lt $(pgrep -c -f "$0") ]]; then
    pkill -f rofi
    pkill -f "$0"
    exit 1
fi

これが正確に私が望むものか、このコードの機能が何であるかよくわかりません。

ベストアンサー1

tl;dr: 実際、コードは「rofipkill が終了できるプロセスが見つからない場合は実行rofi」と示しています。すでに実行している場合は、実際に終了するように求められません。実行しているかどうかをおおよそ確認し、そうでない場合は起動します。毎回削除したい場合は削除してください-0


-0Kills シグナルは 0 で、呼び出しプロセスにプロセスを終了する権限があるかどうか、およびプロセスが存在することを確認します。実際には何も殺しません。

からman 3 kill

sigが0(ヌル信号)の場合、エラーチェックは実行されますが、実際に信号は送信されません。ヌル信号を使用して pid を検証できます。

このように信号を転送する方法はここに説明されています(実際にはman pkill少し不明瞭です)。-signal-[signal]

-信号--信号シグナル:一致する各プロセスに送信される信号を定義します。数字または記号信号名を使用できます。

プロセスを終了するには、デフォルトのシグナル()を使用せpkillずに使用するか、別のシグナル名または番号を渡して使用します。-0SIGTERM

参考までに、アプリケーションのライフサイクルを処理するこの方法は非常に基本的であり、いくつかの理由で失敗する可能性があります(同期化されていないため、致命的なSignalに置き換えると、次の項目が表示される前に前の項目が消えるkill保証はありません)。 。 )。したがって、理想的には、アプリケーション自体またはサービス管理者にそれをより確実に処理させることをお勧めします。rofi-0

おすすめ記事