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

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

私の場合は、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

答え2

lockfileプログラムが常にシェルから起動され、ユーザーがプログラムを完全に制御できる場合(つまり、サードパーティのプログラムにハードコードされていない場合)、またはそのような一種のロック機構を使用できますflock。例えば

flock -n /tmp/top -c top

.bashrc/ に.zshrc設定すると、シェルの最初のインスタンスだけがコマンドを実行しますtop(そのインスタンスを終了し、他のインスタンスが起動しない限り)。

(シェル初期化だけでなく)手動でコマンドを起動できる関数を作成したい場合があります。

mytop () { flock -n /tmp/$0 -c top; }

mytop必要に応じて実行します。

答え3

これがpgrep行く道であることに同意しますが、いくつかの落とし穴があります。問題を排除するために-q出力をリダイレクトできるため、このオプションを使用する必要はありません。pgrep

pgrep -U $USER top >/dev/null || exec top

問題は、標準ユーティリティではないため、移植性がない可能性があることに留意する必要があることです。以下は、いくつかのヘルプページへのリンクです。

環境USER変数はより完全ですが、POSIXのシェルリストにはないようです(参照)2.5.3 シェル変数)。代わりに、これはUSER使用中であることが知られている多くの変数の1つとして指定されています(コメントを参照)。8.1 環境変数の定義)。

これは次topのように実行されます。あなた自身、間違いなく。次のように実行することを選択した場合その後、使用(優先)または実行に$USER変更します。rootPOSIXには両方とも存在しません(topsudosuリストを見る)。後者(su)はUnixファミリーシステムのどこでも使用できますが、sudo一般的に好まれます。だからあなたは持っているでしょう

pgrep -U root top >/dev/null || exec sudo top

パスワードを要求しないように設定していない場合は、sudoシェルの起動時にパスワードの入力を求められますtop

答え4

私の.zshrc(または何でも)に次のようなフラグメントを追加します。

if pgrep -u $USER プログラム名
それから
    ランチャー名
フィリピン諸島

警告する:まだこのコードをテストしていません。ルートまたはサーバーの唯一のユーザーでは、この機能を使用しないでください。フェイルバックを保証します。

関連情報