私のソフトウェアの2番目のインスタンスが起動しないようにする

私のソフトウェアの2番目のインスタンスが起動しないようにする

起動時に特定のソフトウェアを実行するためのサービススクリプトを作成しました。手動で実行できないようにソフトウェアを制限するにはどうすればよいですか?

私の言葉は、ソフトウェアがメモリ内に1つのインスタンスしか持てないということです。

私は私のソフトウェアのソースコードを変更したくないので、これを私のために初期化したいと思います。

答え1

これはbashスクリプトで動作します。外部ソフトウェアの他のインスタンスが見つかると、スクリプトの実行が中断されます。ここで核心は `pidof' である。

#!/bin/bash

# Abort startup if another instance was found    
pidof /path/to/software.executable > /dev/null && {
  echo Sorry. Only one instance allowed.
  exit
}

または、ロックファイルを使用して実行中のインスタンスを置き換えることができます(つまり、最初に実行中のインスタンスを終了してから実行を許可します)。

ただし、エキスパートユーザーはこのスクリプトをバイパスして外部コマンドを直接呼び出すことができます。

答え2

initにソフトウェアインスタンスを1つだけ実行するように指示できます。実際、これはinitでソフトウェアを起動すると自然に起こります。しかし、initの作業は、他のプログラムがソフトウェアの他のインスタンスを起動するのを防ぐこととは何の関係もありません。

プログラムのインスタンスを1つだけ実行するには、プログラムを直接実行するのではなく、ソフトウェアがすでに実行されていることを確認するラッパースクリプトを実行します。LatinSuDの答えそのようなラッパースクリプトの例が提供される。

もちろん、ユーザーはラッパースクリプトをバイパスし、ソフトウェアの他のインスタンスを実行できます。ただし、ユーザーはあなたと同じ実行ファイルを作成して実行することもできます。したがって、必要な制限は実際にはラッパースクリプトを介して意味のある方法で実装されています。

同じ実行ファイルの複数のインスタンスを実行すること自体は問題ではありません。問題が発生する可能性があるのは、ファイル、ネットワークポートなど、同じリソースにアクセスする場合です。同じリソースへの同時アクセスを防ぐ必要がある場合、考えられるアプローチはリソースが何であるかによって異なります。リソースがTCPまたはUDPポートの場合、いずれにせよ1つのプロセスだけがそのポートでリッスンできます。リソースがファイルの場合は、initスクリプトによって開始されたインスタンスを実行しているユーザーだけがファイルにアクセスできることを確認してください。

答え3

古いスレッドですが、ここにいくつかのメモを書く価値があります。 「/bin/bash /tmp/my_script.sh」や「python my_script.py」などの親プロセスでプロセスを実行している場合は、次の方法を使用してください。

pgrep -l my_script.sh >/dev/null && echo "Another process is running" || { 
do your stuff;
}

答え4

実際、正しい権限を持つユーザーへのアクセスを拒否し、root(類似)ユーザーのみがソフトウェアを実行できるようにすることは賢明です。

関連情報