シェルを起動するときにプログラムが実行されていることを確認し、プログラムがまだ実行されていない場合はどうすればよいですか?

シェルを起動するときにプログラムが実行されていることを確認し、プログラムがまだ実行されていない場合はどうすればよいですか?

私の場合は、bashおよび/またはzshでシェルを起動するときにプログラムがすでに実行されていることを確認するために、.zshrcおよび/または.bashrcに任意の行を追加する必要があります。プログラムがまだ実行されていない場合は起動します。それ?

例:新しいzshシェルを起動しています。 topがまだ実行されていない場合は、topを起動してシェルを引き継ぐようにしたいと思います。 topがすでに別のウィンドウで実行されている場合は、.zshrcが読み込まれ続け、開いている端末を提供したいと思います。

6-16アップデート:

if ! pgrep -U $USER top >/dev/null; then
exec top
fi

上記のスクリプトは私の要件を満たしています。 -q フラグは私のシステムのオプションではないため、機能しません。そのため、PIDを/dev/nullにパイプする必要があります。ありがとう、Mveroone, Kusalananda, Thomas Dickey.

元の質問の範囲を超える機能があります。シングルユーザーシステムを使用していると仮定すると、パスワードを入力しなくてもルートになります。必要に応じてrootとして自動的にtopを実行するにはどうすればよいですか?

6-18 良いです。ルートにコマンドを渡すときに発生する機能クリープの問題を修正しました。複数発射に使った

すべての思いやりのある回答に感謝します。

ベストアンサー1

pgrep次のように使用してください。

if ! pgrep -u $USER top >/dev/null 2>&1; then
    exec top
fi

説明する:

  • pgrepコマンドが実行中であることが確認されると、ユーティリティはゼロ終了コードで終了します。したがって、テストは拒否されます。
  • -u $USER何らかの理由で他の人のプロセスをインポートしないように現在のユーザーに制限することもできます。$USER標準シェル変数です。何らかの理由で定義されていない場合は試してみ$LOGNAME$( id -n -u )ください。$LOGNAME返品標準シェル変数)。
  • 出力は不要なので、pgrep標準出力とエラーストリームにリダイレクトします/dev/null

top(またはそうでない場合)実行中であることが見つからない場合は、OPexecの質問に従ってシェルを置き換えます。

これは互換性のあるすべてのシェルで機能しますsh

編集:pgrepBSDシステム(OS X、OpenBSDなど)の実装には-q出力を削除するオプションがありますが、pgrepこのフラグはLinuxでは利用できないようです。 BSDシステムでは、少し見苦しいリダイレクトの代わりにこれを使用してください/dev/null

おすすめ記事