私の場合は、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
。
編集:pgrep
BSDシステム(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
変更します。root
POSIXには両方とも存在しません(top
sudo
su
リストを見る)。後者(su
)はUnixファミリーシステムのどこでも使用できますが、sudo
一般的に好まれます。だからあなたは持っているでしょう
pgrep -U root top >/dev/null || exec sudo top
パスワードを要求しないように設定していない場合は、sudo
シェルの起動時にパスワードの入力を求められますtop
。
答え4
私の.zshrc(または何でも)に次のようなフラグメントを追加します。
if pgrep -u $USER プログラム名 それから ランチャー名 フィリピン諸島
警告する:まだこのコードをテストしていません。ルートまたはサーバーの唯一のユーザーでは、この機能を使用しないでください。フェイルバックを保証します。